2

我有一个接收消息以处理批处理(BatchProcessor)的 MDB。BatchProcessor 不会一次处理批处理中的一个项目,而是创建一个 BatchItemProcessor 并使用 Semaphore 将允许一次同时处理最大数量的项目。BatchItemProcessors 是无状态会话 bean,由 Glassfish 容器注入。

每当我们完成处理带有状态的批处理项目时,我们都需要向另一个服务发送 SOAP 消息。BatchItemProcessor 创建/发送消息到 JMS 主题。我们有另一个 MDB,StatusSender,它侦听此消息并创建/发送 SOAP 消息到其他服务。

问题在于,只有在 BatchProcessor 调度了所有批处理项之后,才会发送 SOAP 消息。

查看日志,BatchItemProcessors 是在 EJB 线程池中创建的(例如,来自日志的名称:),__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 设置配置(默认配置和服务器配置),我有以下内容(我认为这是默认设置):

  • 初始和最小池大小 = 0
  • 最大池大小 = 32
  • 池调整数量 = 8
  • 空闲超时 = 600

如果有人打电话帮助我解决这个问题,将不胜感激。此外,对于好的资源(书籍、网站等)的任何建议也将不胜感激。

更新

我的问题与一些导致 StatusSender onMessage 执行延迟的代码逻辑有关。但是,我仍然希望有任何关于 Glassfish 和线程/池的良好参考的建议。

4

0 回答 0