【发布时间】:2016-08-18 23:41:47
【问题描述】:
在 WildFly 8.2(使用 JMS 提供程序 HornetQ)上创建一个 JMS 队列,并让该队列“激活”一个消息驱动 bean,我看到如果生产者快速连续地向队列发送多条消息,则消息驱动 bean 不一定按照它们发送的顺序处理它们。是否可以配置 WildFly 以使消息按发送顺序(先进先出)进行处理?
【问题讨论】:
在 WildFly 8.2(使用 JMS 提供程序 HornetQ)上创建一个 JMS 队列,并让该队列“激活”一个消息驱动 bean,我看到如果生产者快速连续地向队列发送多条消息,则消息驱动 bean 不一定按照它们发送的顺序处理它们。是否可以配置 WildFly 以使消息按发送顺序(先进先出)进行处理?
【问题讨论】:
(看了https://stackoverflow.com/a/6744508/999264之后我想已经明白了什么)
有多个线程执行消息驱动 bean (MDB) 的 onMessage 方法,每条消息一个线程,因此,如果多条消息几乎同时到达,则无法知道首先处理哪条消息(因为不知道哪个线程将首先完成onMessage 执行)。知道这一点的唯一方法是确保线程数为 1:在这种情况下,唯一的线程首先处理第一条消息,然后处理第二条消息,依此类推。
在 WildFly 和 JBoss 中,注释 @MessageDriven 具有“激活配置属性”maxSession,据我了解,它控制用于处理从队列到达 MDB 的消息的最大线程数。将其值设置为1,如下所示
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "java:/jms/queue/myOwnQueue"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "1")})
public class MyOwnMDB implements MessageListener {
public void onMessage(Message message) {
System.out.println("message received " + message.toString());
}
}
并运行代码,我看到消息确实正在由消息驱动 bean 按发送顺序处理。
我更改了问题的标题,因为原来的标题“有没有办法让 WildFly FIFO 上的消息队列?”,显示不正确:队列本身 是 strong> FIFO(实际上,我在某处发现这是 JMS 规范的一部分,虽然我无法确定确切的位置)。