Асинхронная отправка в очередь с использованием проблемы Spring Jms

У меня есть требование, когда мне нужно асинхронно писать в очередь в activemq. Я использую Spring Jms для этого. Это проводка в моем файле контекста весны

<bean id="amqProducerConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="${activemq.broker}"/>        
    </bean>

    <bean id="pooledProducerConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop" lazy-init="true">
        <property name="connectionFactory" ref="amqProducerConnectionFactory" />
    </bean>

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="pooledProducerConnectionFactory" />
    </bean>

И в моем коде... я делаю..

void sendMessage(JmsTemplate jmsTemplate, String message, String requestQueue) {
        def messageCreator = { session ->
            session.createTextMessage(message)
        } as MessageCreator

        jmsTemplate.send(requestQueue, messageCreator)
    }

Но вышеописанное работает синхронно, а не асинхронно. Есть ли что-нибудь, что мне нужно добавить сюда, чтобы сделать процесс асинхронным (я имею в виду, что приложение «А» записывает в очередь. Оно должно писать в очередь и забывать, а не ждать, пока приложение «Б» заберет его из очереди и обрабатывает его.)


person user1717230    schedule 10.05.2013    source источник
comment
Это работает асинхронно; с чего вы взяли, что он будет ждать потребителя?   -  person Gary Russell    schedule 10.05.2013
comment
Это комментарий, а не ответ   -  person Jim Garrison    schedule 10.05.2013


Ответы (1)


Отправка JmsTemplate никогда не бывает синхронной с точки зрения ожидания получения потребителем сообщения очереди в обычном случае. Однако отправка может быть синхронной в том смысле, что она ожидает ответа от брокера, указывающего, что он получил и сохранил сообщение. Это делается для того, чтобы у вас было указание на успех, поскольку очереди должны гарантировать их надежность. Вы можете настроить множество вещей в ActiveMQConnectionFactory, чтобы контролировать это. Установка параметров useAsyncSend заставит вашу отправку не ждать ACK брокера, если это то, что вы хотите. Все эти параметры задокументированы.

Вы настраиваете их в URI подключения следующим образом: tcp://localhost:61616?jms.useAsyncSend=true

Однако отправка может быть заблокирована, если срабатывает управление потоком поставщика ActiveMQ Broker, чтобы предотвратить переполнение поставщиком брокера. с сообщениями. Это также можно настроить как с точки зрения полного отключения, так и с тем, что вы можете увеличить лимиты памяти на Брокер, когда это может сработать.

Наконец, отправка поставщика может быть заблокирована, если соединение с брокером потеряно и вы используете отказоустойчивый транспорт для ваш клиент автоматически переподключится.

person Tim Bish    schedule 11.05.2013
comment
JmsTemplate получает соединение от фабрики соединений синхронно. Может ли быть так, что отправка задерживается, если соединение еще не установлено или соединение вообще не может быть установлено? Если да, что было бы лучшим обходным путем для обеспечения того, чтобы полная обработка JmsTemplate оставалась асинхронной в любом случае? - person jeromerg; 16.09.2016