特定托管 Bean 实例在时间间隔后过期

2024-01-02

我有 2 个 JSF 托管 beanA and B我需要过期/销毁/销毁A2分钟后B5分钟后。我检查了这个相关问题bean 超时 https://stackoverflow.com/questions/14581536/timing-out-from-a-bean,但整个会话即将到期。我不想让整个会话过期。

如何通过自定义范围实现此目的?


鉴于您正在使用 JSF bean 管理工具(因此不是 CDI,这需要完全不同的答案),您可以通过以下方式实现此目的@CustomScoped http://docs.oracle.com/javaee/7/api/javax/faces/bean/CustomScoped.html. The @CustomScoped值必须引用一个Map在更广泛的、通常是现有的范围内实施。

就像是:

@ManagedBean
@CustomScoped("#{timeoutScope}")
public class TimeoutBean {}

As the @CustomScoped注解不支持传递附加参数,设置超时只能通过附加自定义注解来完成,如下所示:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Timeout {

    /** Minutes. */
    int value();

}
@ManagedBean
@CustomScoped("#{timeoutScope}")
@Timeout(5) // Expires after 5 minutes.
public class TimeoutBean {}

现在,这是一个启动示例,说明如何#{timeoutScope}看起来像,包括@PostConstruct支持(自动)和@PreDestroy支持(手动):

@ManagedBean
@SessionScoped
public class TimeoutScope extends HashMap<String, Object> {

    private static final long serialVersionUID = 1L;

    @Override
    public Object put(String name, Object bean) {
        Timeout timeout = bean.getClass().getAnnotation(Timeout.class);

        if (timeout == null) {
            throw new IllegalArgumentException("@Timeout annotation is required on bean " + name);
        }

        Long endtime = System.nanoTime() + (timeout.value() * (long) 6e10);
        Object[] beanAndEndtime = new Object[] { bean, endtime };
        return super.put(name, beanAndEndtime);
    }

    @Override
    public Object get(Object key) {
        Object[] beanAndEndtime = (Object[]) super.get(key);

        if (beanAndEndtime == null) {
            return null;
        }

        Object bean = beanAndEndtime[0];
        Long endtime = (Long) beanAndEndtime[1];

        if (System.nanoTime() > endtime) {
            String name = (String) key;
            ScopeContext scope = new ScopeContext("timeoutScope", Collections.singletonMap(name, bean));
            FacesContext context = FacesContext.getCurrentInstance();
            context.getApplication().publishEvent(context, PreDestroyCustomScopeEvent.class, scope);
            return null;
        }

        return bean;
    }

}

你看,它是会话范围的并且实现了Map。至于范围,这样它就与特定的用户会话相关联,而不是与整个应用程序相关联。如果您确实想要在应用程序中的所有用户会话之间共享该 bean,那么请将其设置为应用程序范围。至于Map,无论 JSF 需要查找托管 bean,它都会首先尝试get()。如果返回的话null(即 bean 尚不存在),然后它将自动创建托管 bean 实例并执行put().

在 - 的里面put(),这是提取并计算超时并将其存储在映射中的问题。在 - 的里面get(),你只需检查超时并返回null指示 JSF 该 bean 不再存在。然后 JSF 将简单地自动创建它并返回put(), etc.

请注意我正在使用System#nanoTime() http://docs.oracle.com/javase/8/docs/api/java/lang/System.html#nanoTime--代替System#currentTimeMillis() http://docs.oracle.com/javase/8/docs/api/java/lang/System.html#currentTimeMillis--因为后者与 OS(操作系统)时间相关,而不是与硬件时间相关(因此它对 a.o. DST 和最终用户控制的时间变化敏感)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

特定托管 Bean 实例在时间间隔后过期 的相关文章

随机推荐

  • 使用登录过滤器而不是控制器时处理 OPTIONS 和 CORS

    我有一个AbstractAuthenticationProcessingFilter我用来处理路径中的 POST 请求 sign in CORS 预检请求返回 404 因为没有匹配的路径 这对我来说很有意义 我想知道是否有一种方法可以通知
  • 在 Firebird 中插入选择

    我是火鸟新手 有很多问题 我想将各种行插入到从另一个表中选择的表中 这是代码 CREATE GENERATOR POS SET GENERATOR POS TO 1 SET TERM create trigger BAS pkassign
  • Laravel 5.1 - Facebook 通过 Socialite(客户端错误:400)

    Using Laracast 上的本教程 https laracasts com series whats new in laravel 5 episodes 9 Laravel 5 0 社交名流 特别是直到12 11 分钟 我已经成功设置
  • React 和 Flex 布局如何使用它们

    我正在尝试使用React和flexbox 通常我可以在react native中使用flexbox 但我无法在react js中实现 这是我的 CSS 文件 wrapper html body height 100 margin 0 pos
  • 在 Tensorflow 中确定未知形状的变量等级

    在张量流中创建变量时validate shape False 它也忽略变量等级 x tf placeholder tf float32 None 10 v tf Variable tf ones like x trainable False
  • Firebase/Crashlytics 未收到崩溃信息

    我通过按钮强制崩溃 而 Firebase Crashlytics 似乎没有显示出来 我的应用程序的一些背景 我的应用有两个App ID 一个供企业内部使用 一个供应用商店使用 触发构建时会触发脚本 以便正确的 GoogleService I
  • 工作时间选择?

    在堆栈溢出中看到了对另一个问题的引用 我检查了类似的解决方案 但尚未成功 div class form group div
  • mongodb 和 mongo 之间的冲突(mongo-ruby-driver)

    我需要使用两颗宝石mongoid and mongo在我的 Rails 应用程序中 有什么想法可以解决这个麻烦的问题吗谢谢 gem mongo 2 0 2 git gt git github com mongodb mongo ruby d
  • 将自定义 createMaterialTopTabNavigator 添加到组件?

    I have an issue with createMaterialTopTabNavigator I m already declaring an AppContainer in my Route js File 如果在我想添加这些 T
  • 查找给定字符串中的所有浮点数或整数

    给定一个字符串 Hello4 2this is random 24 text42 我想返回所有整数或浮点数 4 2 24 42 所有其他问题的解决方案都仅返回 24 即使数字旁边有非数字字符 我也想返回浮点数 由于我是 Python 新手
  • 当类中的函数被调用时触发事件

    PHP 是否可以在调用类中的函数时触发事件 而不将其添加到类中的每个函数中 Example
  • Fortran/gfortran 中的高精度幂运算

    gfortran 如何处理整数与实数的幂运算 我一直认为它是相同的 但考虑一下这个例子 program main implicit none integer parameter dp selected real kind 33 4931 r
  • jQuery 单击 _blank

    在你们的帮助下 我现在有了一个像魅力一样工作的脚本 我现在唯一需要的是在新选项卡 窗口中打开 URL 的脚本 document ready function onskeliste li click function window locat
  • Vite 重新加载循环

    我正在尝试完成从 Parcel 到 Vite 的迁移 我们使用 caddy 通过 Docker 容器在本地反向代理自定义域 我遇到的问题是 当我在浏览器中加载客户端时 它会不断刷新 控制台说 vite 正在连接 然后循环中 服务器连接丢失
  • 如何在 Mozilla 加载和解析 HTML 之前对其进行预处理?

    我需要一种在 Mozilla 实际加载和解析 HTML 之前对其进行处理的方法 我可以在 Firefox 扩展中使用任何内容侦听器吗 Add an 事件监听器 https developer mozilla org en DOM eleme
  • PropertyChangedEventHandler 如何工作?

    这是一个非常简单的问题 但我想知道是否有人可以解释第四行实际上在做什么 所以第一行向处理程序提供了一个事件 我真的不知道处理程序在什么情况下会返回 null 或最后一行的作用 当您将对象和属性更改传递给处理程序时 它会对它们做什么 Prop
  • Android:有没有可以分析本机代码的工具?

    我只找到了一种分析工具 http code google com p android ndk profiler http code google com p android ndk profiler 到目前为止还无法让它工作 所以我想知道是
  • 是否可以在 swift 4 的代码中关闭 wifi 或将 iPhone 切换到离线模式?

    我想知道是否有任何方法可以在 swift 4 中的代码中打开或关闭 iPhone wifi 或将设备切换到离线模式 我知道苹果可能不允许应用程序可以做这样的事情在App Store中分发但这并不重要我只是想知道是否有任何代码可以做到这一点
  • c/c++ - 通过套接字发送 time_t 的最安全方法

    我已经设置了 C 服务器 客户端环境 并尝试将 time t 值从服务器发送到客户端 在任何服务器中都是有用的 但我遇到了一个头痛的问题 time t 似乎不符合任何尺寸规格 我想知道通过网络发送 time t 最安全 更便携 的方式是什么
  • 特定托管 Bean 实例在时间间隔后过期

    我有 2 个 JSF 托管 beanA and B我需要过期 销毁 销毁A2分钟后B5分钟后 我检查了这个相关问题bean 超时 https stackoverflow com questions 14581536 timing out f