1

在 WildFly 8.2(使用 JMS 提供程序 HornetQ)上创建一个 JMS 队列,并让该队列“激活”一个消息驱动 bean,我看到如果生产者快速连续向队列发送多条消息,消息驱动 bean不一定按照发送的顺序处理它们。可以配置 WildFly 以便按发送顺序(先进先出)处理消息吗?

4

1 回答 1

2

(我想在阅读https://stackoverflow.com/a/6744508/999264后了解会发生什么)

有多个线程执行onMessage消息驱动 bean (MDB) 的方法,每个消息一个线程,因此,如果多条消息几乎同时到达,则无法知道将首先处理哪条消息(因为无法知道哪个消息线程将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 上制作消息队列?” ,看起来不正确:队列本身FIFO(实际上,我发现某处写着这是 JMS 规范的一部分,尽管我无法确定确切的位置)。

于 2016-08-18T08:40:36.510 回答