2013-03-12 137 views
1

我們使用Spring JMSTemplate 3.0.1RELEASE將JMS消息發送到ActiveMQ集羣。Spring JMSTemplate - 丟失的消息

我正在使用useAsynSend = true來發送異步請求,因爲這些都是Fire和Forget。但是它們仍然是持久的,我可以確認它們首先保持在AMQ Kaha-DB上,然後轉發到Message Listeners。沒有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 Listeners配置爲偵聽上面由'qName'定義的ActiveMQ隊列中的消息。大部分消息都傳遞給了AMQ,而且Mule會在幾秒鐘內將它們撿起來。然而,它只是一些消失的消息。當我查看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 = [email protected], marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 0, properties = null, readOnlyProperties = false, readOnlyBody = false, droppable = false} 

任何我缺少的JMSTemplate配置或AMQ上的一些行爲?請幫忙!

任何幫助傢伙?

+0

我想,缺少的消息是在其他經紀人,它沒有被消耗。 – techuser 2013-03-14 04:45:06

+0

嗨..你可以多說一點嗎? – Soumya 2013-03-14 10:37:23

+0

我的建議是檢查兩個經紀人的消息數量,因爲您使用啓用隨機啓動的故障轉移連接,並確保消費者實際上都從這兩個經紀人消費。 – techuser 2013-03-14 13:36:54

回答

1

2可以考慮的原因。 1)我們使用錯誤的連接工廠。我們應該使用Pooled Connection Factory和JMSTemplate來發送消息。 org.apache.activemq.pool.PooledConnectionFactory

2)我們使用useAsyncSend = true - 即發送者發送消息,並且不等待確認並且有消息丟失的機會。這似乎更可能但不確定。

仍然不接受這個答案,因爲某人可能有更具體的解釋。與此同時,如果有人絆倒這個問題可能會受益於這個線索。