在WildFly 8.2上创建一个JMS队列(使用JMS提供程序HornetQ),并使用消息驱动的bean"激活"通过这个队列,我看到如果生产者快速连续地向队列发送多条消息,则消息驱动的bean不会按照发送顺序对它们进行处理。可以配置WildFly,以便按照发送的顺序处理消息(先进先出)吗?
答案 0 :(得分:2)
(我想已经理解了阅读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上建立消息队列?" ,显示不正确:队列本身是 FIFO(实际上,我发现这是JMS规范的一部分,尽管我无法确定确切位置)。