我有一个MDB接收处理批处理的消息(BatchProcessor)。 BatchProcessor不是一次处理批处理中的一个项目,而是创建一个BatchItemProcessor,使用Semaphore将允许一次同时处理最大数量的项目。 BatchItemProcessors是无状态会话bean,由Glassfish容器注入。
每当我们完成处理具有其状态的批处理项目时,我们需要将SOAP消息发送到另一个服务。 BatchItemProcessor创建/发送消息到JMS主题。我们有另一个MDB,StatusSender,它监听这些消息并创建/发送SOAP消息到其他服务。
问题是在BatchProcessor调度了所有批处理项之前,不会发送SOAP消息。
查看日志,正在EJB线程池中创建BatchItemProcessors(例如,来自日志的名称:__ejb-thread-pool10
),并创建BatchProccessor和StatusSender,我假设是Glassfish MDB线程池(例如,日志中的名称:p: thread-pool-1; w: 39
)。
我假设(因为我无法找到确认/拒绝的文档)p: thread-pool-1;
标识池和w: 39
实际线程。如果这是真的,则BatchProcessor使用与StatusSender完全不同的线程,因为线程标识符不同(一个用于BatchProcess,一个用于StatusSender)。
这意味着我真的很困惑为什么BatchProcessor onMessage必须在可以执行StatusSender onMessage调用之前完成。
查看我的Glassfish EJB容器/ MDB设置配置(default-config和server-config)我有以下内容(我认为是默认设置):
如果有人打电话帮我解决这个问题,我们将不胜感激。此外,任何有关良好资源(书籍,网站等)的重新推荐也将受到赞赏。
更新
我的问题与一些导致StatusSender onMessage执行延迟的代码逻辑有关。但是,我仍然感谢任何关于Glassfish和线程/池的良好参考的建议。