Есть ли способ сделать обработку очереди сообщений MDB, на WildFly, FIFO?

Создав очередь JMS в WildFly 8.2 (с JMS-провайдером HornetQ) и имея управляемый сообщениями bean-компонент, «активированный» этой очередью, я увидел, что если производитель отправляет в быстрой последовательности несколько сообщений в очередь, управляемый сообщениями bean-компонент не обрабатывает их обязательно в том порядке, в котором они были отправлены. Можно ли настроить WildFly так, чтобы сообщения обрабатывались в том порядке, в котором они отправляются («первым пришел - первым отправил»)?


person John Donn    schedule 17.08.2016    source источник


Ответы (1)


(Думаю, я понял, что происходит после прочтения https://stackoverflow.com/a/6744508/999264)

Существует несколько потоков, которые выполняют метод onMessage компонента, управляемого сообщениями (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, хотя я не могу указать точное место).

person John Donn    schedule 18.08.2016
comment
access.redhat.com/documentation/en- США / - person 99Sono; 28.02.2017