0

最近 Hornetq コードを学んでいて、JMSbridge に疑問を持っています。

ご覧のとおり、JMSbridgeImpl.java には「sendMessages()」という名前の fun があります。fun send msg をリモート JMSServer に送信しますが、確認応答は行いません。

しかし、"sendBatchNonTransacted()" という名前の fun の int には、"messages.getLast().acknowledge();" などの最後のメッセージで確認するだけです。

問題は、「sendMessages()」という名前の楽しみの各メッセージで確認しないのはなぜですか?

申し訳ありませんが、私の英語はプールです。

オンラインであなたの助けを待っています!ありがとう !

--------------------------------------------

ああ、最初の質問をしてくれた「Moj Far」に感謝します。わかりました。

しかし、別の質問があります。hornetQ のソース コードを変更しました。ClientConsumer (init が成功した) を使用してローカルの HornetQでメッセージを取得し、
JMS プロデューサーを使用してリモートの JMSServer にメッセージを送信したいと考えています。

「SourceReceiver」クラスの「Run」機能で、次のように変更します。

if (bridgeType == JMSBridgeImpl.ALL_NETTY_MODE ) {
    msg = sourceConsumer.receive(1000);
} else {        /* core client receive msg */
    cmsg = localClientConsumer.receive(1000);
    if (cmsg != null) {
        hq_msg = HornetQMessage.createMessage(cmsg, localClientSession);
        //hq_msg = HornetQMessage.createMessage(cmsg, null);
        hq_msg.doBeforeReceive();
        //cmsg.acknowledge();       do ack after send
        msg = hq_msg;
    }
}                                   

しかし、2 時間実行した後、VM メモリはオーバーフローします。

私も localClientSession を使用して HornetQMessage を作成しないようにしていますが、メモリもオーバーフローしています。

私のコードに何か問題がありますか?

4

1 に答える 1

1

メッセージの送信を保証する方法は 2 つあります。

  1. トランザクション (sendBatchLocalTx() および sendBatchXA() で使用)
  2. 非トランザクションまたは承認 (sendBatchNonTransacted() で使用)

すべての sendBatchLocalTx()、sedBatchXA()、および sendBatchNonTransacted() は、メッセージの送信に sendMessages() を使用し、独自の方法でメッセージを送信することを保証します (トランザクションをコミットするか、メッセージを確認します)。

sendBatchNonTransacted() では、Client Acknowledgment Modeを使用します。このモードでは、メッセージ (ここでは最後のメッセージ) を確認すると、現在のセッションで送信されたすべてのメッセージが確認されます!

于 2013-06-08T17:52:15.020 に答える