【问题标题】:How to handle multiple MDB instances with more listener sessions如何处理具有更多侦听器会话的多个 MDB 实例
【发布时间】:2016-11-28 01:05:53
【问题描述】:

这是关于 Websphere 应用程序服务、Java 消息服务、消息队列和侦听器的。

我有一个场景,我的听众可以有更多的会话。所以我的 MDB(消息驱动 bean)在 WAS 服务器线程上运行时可以有多个实例。

我的 MDB 将处理/解析收到的消息并进行一些数据库事务。因此,如果我的 MDB 收到更多消息(假设接收 2 条消息),MDB 将创建 2 个实例,因为我的侦听器会话值已设置为 2,并尝试在单个线程上同时处理这两条消息。我保留了一个 thread.sleep(1000) 来处理一个消息,而另一个实例正在处理。但是两个 MDB 实例都在同一个线程上运行,我的整个进程处于睡眠状态 1 秒,然后再次尝试并行执行两个进程并回滚两个进程。

关于这种情况的任何建议。

【问题讨论】:

  • 多个实例旨在用于可并行处理的消息。如果出于某种原因您的应用程序不允许并行消息处理,则不要使用多个会话。确保一次只处理一条消息的唯一安全方法是序列化消息处理,这完全违背了多个会话的目的。
  • 感谢 Yuri Steinschreiber 的回复。但这是我的要求。我的系统可以同时处理不同的用户消息(我的意思是并行)。但如果消息来自同一用户,那么我需要一个接一个地处理。

标签: jakarta-ee jms ibm-mq message-driven-bean


【解决方案1】:

无需详细说明为什么您不想同时处理两条消息,您可以使用类似这样的方式随机化睡眠间隔。

(int) Math.floor(Math.random() * 10)

这不是一个完整的证明方法。它只会根据您选择的随机化范围降低同时处理两条消息的概率(这种方法会大大降低您的吞吐量)。

我相信会有更好的方法来解决您的问题,例如 同步块。您能否更新问题,说明您不想并行处理消息的原因?

【讨论】:

  • 任何类型的同步都会使消息处理顺序化,从而首先破坏了使用多个实例的目的。那何必呢?
  • 我同意你的观点,同步将使处理按顺序进行。但在某些情况下,我更喜欢多线程的同步块而不是单线程配置。例如,如果有繁重的 CPU 密集型消息处理,然后是无法并行运行的代码,如数据库查找和插入,我会在保持繁重的多线程处理的同时使查找和插入同步。
  • 在使用多线程同步之前,我会回到需求和设计,无论是显式同步还是巧妙地使用睡眠。最好的同步是完全不同步,除了数据库本身提供的之外,绝大多数应用程序都不需要它。通常,人们需要的是消息处理重组,而不是设计不佳的处理的同步。
  • “最好的同步就是不同步”——我完全同意。
  • 大家好,这是我的要求。我的系统可以同时处理不同的用户消息(我的意思是并行)。但是如果消息来自同一个用户,那么我需要一个接一个地处理..
猜你喜欢
  • 2013-07-25
  • 2011-12-02
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
相关资源
最近更新 更多