3

ActiveMq で単純な pub/sub を実行しようとしています。私はそれをすべて正常に動作させることができますが、サブスクライバーは約 30 秒後に切断されます。変更できるタイムアウトの種類の値を探しましたが、何も機能していないようです。サブスクライバーは次のとおりです。

using System;
using Apache.NMS;
using Apache.NMS.ActiveMQ;
using Apache.NMS.ActiveMQ.Commands;

namespace ActiveMQCatcher
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/");

            using (IConnection connection = factory.CreateConnection())
            {
                connection.ClientId = "MYID";
                connection.Start();

                using (ISession session = connection.CreateSession())
                {
                    IMessageConsumer consumer = session.CreateConsumer(new ActiveMQTopic("MYTOPIC"), null, false);
                    consumer.Listener += consumer_Listener;

                    Console.ReadLine();
                }

                connection.Stop();
            }
        }

        private static void consumer_Listener(IMessage message)
        {
            Console.WriteLine("Got: " + ((ITextMessage) message).Text);
        }
    }
}

私はこれを試しました:

connection.RequestTimeout = TimeSpan.MaxValue;

しかし、何も変わったようには見えませんでした。

問題を解決するには、プログラムを実行して約 30 秒間待ちます。ActiveMQ コンソールで接続が消えたことを確認できます (デフォルトではhttp://localhost:8161/admin/connections.jsp )。

何か案は?

4

4 に答える 4

2

警告! 設定するとmaxInactivityDuration=0、ソケットが死ぬことはないようです。を呼び出しCloseても、DisposeIConnectionになる接続とそれが実行されているスレッドは残ります。実装によっては、これはメモリリークを意味する可能性があります。

于 2010-04-19T07:50:31.900 に答える
2

もちろん、質問を投稿してからわずか数分でわかります。探している他の人のための答えは次のとおりです。

問題は、NMS が OpenWire を使用しており、OpenWire のデフォルトのタイムアウトが 30 秒であることです。これは、\conf\ActiveMq.xml ファイルで変更できます。変更する必要があるのは次のとおりです。

<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?wireFormat.maxInactivityDuration=0"/>
</transportConnectors>

その wireFormat.maxInactivityDuration パラメータが重要です。

于 2010-01-15T17:14:09.293 に答える
1

古いバージョンの NMS を使用しているようです。最新のリリース (1.5.5) に更新してみてください。この問題は解決するはずです。過去数回のリリースですべて解決されたフェイルオーバーと非アクティブ モニターに関連するいくつかの問題がありました。最新バージョンは十分に強化されています。

Tim Fusesource.com

于 2010-09-06T21:18:14.517 に答える
0

それが答えなのか、それ以上の質問なのか(または2つ;)わからない、

ただし、NMS の使用では、接続 URL のクライアント側で wireFormat.MaxInactivityDuration=-1 を指定します。

同じ効果のようですが、「-1」と「0」のどちらを使うべきでしょうか?? 不思議、違いは何ですか...

また、興味深いことに、どういうわけかサーバー構成で何も指定していませんが、すべての JAVA アプリ接続は関係なく接続されているようです (JAVA クライアントが OpenWire config.params または smtng に異なるデフォルトを使用しているためですか?)

于 2010-06-03T10:58:45.290 に答える