1

Spring JMSTemplate 3.0.1RELEASE を使用して、JMS メッセージを ActiveMQ クラスターに送信しています。

これらはすべて Fire and Forget であるため、useAsynSend=true を使用して非同期リクエストを送信できるようにしています。ただし、それらはまだ永続的であり、最初に 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 には到達していません。上記の「qName」で定義された ActiveMQ キューでメッセージをリッスンするように Mule JMS リスナーを構成しました。ほとんどのメッセージは問題なく 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 = org.apache.activemq.util.ByteSequence@61408493, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 0, properties = null, readOnlyProperties = false, readOnlyBody = false, droppable = false}

JMSTemplate 構成または AMQ での動作に欠けているものはありますか? 助けてください!

助けてくれる人はいますか?

4

1 に答える 1

1

2 私が思いつく考えられる理由。1) 間違った接続ファクトリーを使用しています。メッセージを送信するには、Pooled Connection Factory と JMSTemplate を使用する必要があります。org.apache.activemq.pool.PooledConnectionFactory

2) useAsyncSend=true を使用しています。つまり、送信者はメッセージを送信し、確認応答を待機せず、メッセージが失われる可能性があります。これはより可能性が高いようですが、確かではありません。

誰かがより具体的な説明を持っている可能性があるため、これを回答としてまだ受け入れていません。それまでの間、誰かがこの質問に出くわした場合、この手がかりの恩恵を受けることができます.

于 2013-03-27T16:55:57.427 に答える