Spring JMSTemplate - потерянные сообщения

Мы используем Spring JMSTemplate 3.0.1RELEASE для отправки сообщений JMS в кластер ActiveMQ.

Я использую useAsynSend=true, чтобы иметь возможность отправлять асинхронные запросы, так как это все Fire и Forget. Однако они все еще сохраняются, и я могу подтвердить, что они сохраняются в AMQ Kaha-DB сначала, а затем пересылаются в прослушиватели сообщений. Нет CorelationID или JMSReplyTo, так как я не слушаю ответ.

   <amq:connectionFactory id="amqJmsFactory"
    brokerURL="failover:(tcp://MY-SERVER-01:61616,tcp://MY-SERVER-02:61616)?randomize=true&jms.useAsyncSend=true" />

<!-- JMS Producer Configuration -->
<bean id="jmsProducerTemplate" class="org.springframework.jms.core.JmsTemplate"
    p:connectionFactory-ref="amqJmsFactory" />

  <bean id="activeMQBinding" class="com.my.company.activemq.ActiveMQProductBinding">
    <property name="template" ref="jmsProducerTemplate" />
</bean>

В классе ActiveMQProductBinding у нас есть следующий метод

  public void sendActiveMQMessageAsync(final Object message, String qName) {
    log.info("About to send message");
    template.send(qName, new MessageCreator() {
        public Message createMessage(Session session) throws JMSException {
            ObjectMessage objectMessage = session.createObjectMessage((Serializable) message);

            log.info("Sending message: " + objectMessage);

            return objectMessage;
        }
    });
}

Теперь я вижу в журналах, что журналы печатаются. Исключение не выбрасывается. Тем не менее, некоторые сообщения полностью теряются. Это, вероятно, не достигает ActiveMQ. У меня есть прослушиватели Mule JMS, настроенные для прослушивания сообщений в очередях ActiveMQ, определенных как "qName" выше. Большинство сообщений доставляются в AMQ в порядке, и Мул забирает их в течение доли секунды. Однако это только некоторые сообщения, которые теряются. Когда я проверил очереди в ActiveMQ, я вижу, что все полученные сообщения были отправлены в Mule. Следовательно, я подозреваю, что сообщения вообще не достигают ActiveMQ или AMQ отклоняет. Однако нет журналов на JMSTemplate Spring или ActiveMQ.

Созданное сообщение выглядит следующим образом (оно напечатано в методе выше).

   2013-03-11 16:33:11,752 INFO [com.my.company.activemq.ActiveMQProductBinding$1] Sending message: ActiveMQObjectMessage {commandId = 0, responseRequired = false, messageId = null, originalDestination = null, originalTransactionId = null, producerId = null, destination = null, transactionId = null, expiration = 0, timestamp = 0, arrival = 0, brokerInTime = 0, brokerOutTime = 0, correlationId = null, replyTo = null, persistent = false, type = null, priority = 0, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = org.apache.activemq.util.ByteSequence@61408493, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 0, properties = null, readOnlyProperties = false, readOnlyBody = false, droppable = false}

Что-то мне не хватает в конфигурации JMSTemplate или какое-то поведение на AMQ? Пожалуйста помоги!

Любая помощь, ребята?

1 ответ

2 Возможные причины, которые я могу придумать. 1) Мы используем неправильную фабрику соединений. Мы должны использовать Pooled Connection Factory с JMSTemplate для отправки сообщений. org.apache.activemq.pool.PooledConnectionFactory

2) Мы используем useAsyncSend=true - т.е. отправитель отправляет сообщение и не ожидает подтверждения, и есть вероятность потери сообщения. Это кажется более вероятным, но не уверен.

Все еще не принимаю это как Ответ, поскольку у кого-то может быть более конкретное объяснение. В то же время, если кто-то наткнется на этот вопрос, могут быть полезны эти сигналы.

Другие вопросы по тегам