暂停 MDB 消息处理,直到 @StartupBean 完成初始化

2024-02-13

在将 JBoss 5 应用程序迁移到 JBoss AS 7 (7.1.1.FINAL) 时,我遇到了新的 JMS 消息驱动 EJB 的问题。在消息处理中,必须检查一些主数据字段。为了提高性能,应使用以下方法将该主数据预加载到缓存结构中:@Singleton @StartupEJB,大约需要30秒来加载数据。

我的问题是,即使缓存尚未完全初始化,队列消息处理也会启动,从而导致消息验证错误。

我试图定义 MDB 和启动 EJB 之间的依赖关系,但据我了解@DependsOn注释仅适用于@SingletonEJB。所以很明显我的解决方案不起作用;-)

启动bean代码:

@Singleton
@Startup
public class StartupBean {

    @PostConstruct
    void atStartup() {
        // TODO load master data cache (takes about 30 seconds)
    }

    @PreDestroy()
    void atShutdown() {
        // TODO free master data cache
    }
}

注意:我从示例中删除了真正的代码,以使其更易于阅读:-)

消息驱动bean代码:

@MessageDriven(name="SampleMessagingBean", activationConfig = {
        @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
        @ActivationConfigProperty(propertyName="destination", propertyValue="jms/SampleQueue"),
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")
    })
    @DependsOn("StartupBean")
    public class SampleMessagingBean implements MessageListener {

    public void onMessage(Message message) {
        // TODO validate message using master data cache
    }
}

问题:如何暂停消息处理,直到启动 bean 完成加载缓存?

任何建议都非常感激:-)!


首先我认为在 mdb 中注入单例 EJB 足以延迟消息消耗 但不,有时它会在 Singleton-ejb 的 @PostConstruct 完成之前开始消费消息。所以还添加了一个方法调用,它开始工作

这适用于 glassfish,但我不明白为什么它不适用于 jboss

单例Ejb:

@Singleton
@Startup
public class SingletonBean {
    private Logger logger = Logger.getLogger(getClass().getName());

    private boolean init = false;

    public boolean isInit() {
        return init;
    }

    @PostConstruct
    public void init() {
        logger.error("singleton init start");

        //Do something that takes time here

        init = true;
        logger.error("singleton init end ");
    }
}    

and mdb:

@MessageDriven(...)
public class SomeMdb implements MessageListener {
    private Logger logger = Logger.getLogger(getClass().getName());

    @EJB
    SingletonBean sb;

    @PostConstruct
    public void init() {
        logger.error("mdb init start");
        if (!sb.isInit()) {
            logger.error("never happens");
        }
        logger.error("mdb init complete");
    }

    public void onMessage(Message message) {
        logger.error("onMessage start");
    }
}    

现在它总是在 mdb 完成 init 之前等待 SingletonBean 完成 init (如日志中所示)

19:51:51,980 [ad-pool-1; w: 3] ERROR SomeMdb       - mdb init start
19:51:52,122 [ad-pool-4848(4)] ERROR SingletonBean - singleton init start
19:51:56,316 [ad-pool-4848(4)] ERROR SingletonBean - singleton init end 
19:51:56,317 [ad-pool-1; w: 3] ERROR SomeMdb       - mdb init complete
19:51:56,317 [ad-pool-1; w: 3] ERROR SomeMdb       - onMessage start
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

暂停 MDB 消息处理,直到 @StartupBean 完成初始化 的相关文章

随机推荐

  • 缺少 Firebase app_update 事件

    我看到了巨大的差异app updateFirebase 自动发送的事件以及用户群在发布时真正转换为新版本的情况 例如新版本发布期间的 5 天 120 个事件 VS 3k 用户 x20 差异 我确实检查了另一个 alpha 更新 其中数据导出
  • Pandas GroupBy 日期范围取决于每行

    我想做以下事情 对于如下所示的数据框 df pd DataFrame ID A A C B B date 06 24 2014 06 25 2014 06 23 2014 07 02 1999 07 02 1999 value 3 5 1
  • 致命错误:在非对象上调用成员函数 fetch_assoc() [重复]

    这个问题在这里已经有答案了 我正在尝试执行一些查询来获取有关某些图像的信息页面 我写了一个函数 function get recent highs view deleted images false lower this gt databa
  • 如何使用flask_sqlalchemy反映现有表

    我注意到一个方法 db reflect bind all app app 但我想知道如何使用它 如果您能提供帮助 我将不胜感激 from flask import Flask from flask sqlalchemy import SQL
  • 从不同的函数访问变量

    我有以下 HTML 代码 它创建一个按钮 单击该按钮时会在我的页面中创建一些问题 工作正常
  • 除了使用 TM_FILENAME_BASE 之外,还有其他方法可以修剪 TM_FILENAME 吗?

    我正在尝试为 redux 容器文件创建一个片段 该文件导入一些具有相同基本名称的反应文件 TM FILENAME BASE 非常适合从文件名中删除 js 但在本例中 我的组件文件的扩展名是 fun thing component js 容器
  • Unix:如何清除串口I/O缓冲区?

    我正在为标准 PC 串行端口开发 高级 C 接口 当我打开端口时 我想清除输入和输出缓冲区 以便不接收或发送以前使用该端口的数据 为此 我使用 tcflush 函数 然而 它不起作用 怎么可能 我的 端口开放 代码如下所示 是的 我使用 C
  • 如何检查变量是否只包含字母

    我尝试检查以下情况 bin bash line abc if line a z then echo INVALID fi 我得到INVALID作为输出 但为什么 没有检查是否 line仅包含 a z 范围内的字符 使用正则表达式匹配运算符
  • 虚拟属性和延迟加载

    根据定义 虚拟属性或方法是对要重写的子类可见的方法 但是 NHibernate 使用虚拟属性来确保延迟加载 我的问题不是关于NHibernate 而是如何使用虚拟属性来实现延迟加载 虚拟财产是否还有我不知道的隐藏行为 它们被声明为 virt
  • 我可以将更多参数传递给 Javascript 中的事件处理函数吗?

    我一直在尝试了解有关鼠标事件的更多信息 例如onmouseover onmouseout and onmousemove但没有太多信息 默认情况下 这些事件处理程序似乎只有一个参数 即事件本身 element onmouseover mou
  • 如何缓存将图像返回到asp.net mvc中视图的操作方法的输出?

    我已经阅读了很多有关缓存的文章 但没有一个真正完全符合我的需求 在我的 mvc 3 应用程序中 我有一个操作方法 GetImage 它返回图像类型的文件 然后我在视图中使用此方法来显示图像 img width 75 height 75 sr
  • boost iostream 映射文件和 boost 进程间映射文件之间有区别吗?

    我想在内存中创建一个映射的二进制文件 但是我不确定如何创建要映射到系统的文件 我多次阅读文档并意识到有两种映射文件实现 一种在 iostream 中 另一种在进程间中 你们知道如何将映射文件创建到共享内存中吗 我试图允许多线程程序读取以二进
  • 如何使用 Qt 在队列中创建多个线程?

    如何使用 Qt 在队列中创建逐步执行的线程 当一个线程完成时另一个线程启动 请给我一个代码示例 Look at Q线程池 http doc qt io qt 5 qthreadpool html 然而 正如 Frank 指出的 如果你一个接
  • 在图像上创建一个图层并通过触摸调整其坐标

    我需要在图像上创建一个图层 并调整该图层以适合图像并获取该图层的坐标 我需要通过触摸和捏合来调整图层 示例图像如下 我需要在 ios 中执行此操作 我可以得到任何想法来执行此操作吗 使用coreImage的人脸检测API来检测人脸的Boun
  • 如何检查一条边是否具有 Networkx 中的属性

    我在 yEd 中创建了一个图 我想检查一条边是否具有属性 例如 有些边缘有标签 但有些则没有 当我尝试这样做时 出现错误 for n nbrs in G adjacency iter for nbr eattr in nbrs items
  • NSString 和 NSUrl 未正确转换

    因此 我尝试从来自 URL 的 XML 流中检索数据 该 URL 是根据用户输入的搜索字符串配置的 这段代码有什么理由不能工作吗 NSString searchString Geoff NSString updatedURL NSStrin
  • Outlook 中的电子邮件地址格式(EX 而不是 SMTP)

    我在 Excel 中有一个名字和姓氏列表 我想利用该列表使用 Visual Basic 在 Outlook 中查找电子邮件地址 我正在使用以下 VB 代码 Private Sub GetAddresses Dim o AddressList
  • Django 模板中的嵌套块

    The master我的 Django 应用程序中的模板如下所示 block parent Some text block child Default content here endblock child some more text e
  • Rails - 如何在数据库中存储“has_many”复选框关联?

    我有桌子User和桌子类别 这两个表之间的关系 user has many categories 类别belongs to user 我想在用户的 标准 编辑页面上显示带有复选框的类别列表 当该用户选中某些复选框时 我想保存它们 然后在下次
  • 暂停 MDB 消息处理,直到 @StartupBean 完成初始化

    在将 JBoss 5 应用程序迁移到 JBoss AS 7 7 1 1 FINAL 时 我遇到了新的 JMS 消息驱动 EJB 的问题 在消息处理中 必须检查一些主数据字段 为了提高性能 应使用以下方法将该主数据预加载到缓存结构中 Sing