1

トピック サブスクライバーを削除する必要があります。私はこれを見つけましたhttp://activemq.apache.org/manage-durable-subscribers.html
しかし、それは私たちにとって十分ではありません。メッセージの有無に関係なく、サブスクライバーを削除するタイミングを制御したいと考えています。また、私たちのプログラムは C# で書かれています。したがって、私たちにとって最適なソリューションは NMS API です。

ありがとう。


コードは次のとおりです。

Apache.NMS.ActiveMQ.ConnectionFactory factory = new Apache.NMS.ActiveMQ.ConnectionFactory(m_brokerURI);
m_connection = factory.CreateConnection(username, password);

Apache.NMS.ActiveMQ.Connection con = (Apache.NMS.ActiveMQ.Connection)m_connection;
ISession session = m_connection.CreateSession(AcknowledgementMode.AutoAcknowledge);

try
{
    session.DeleteDurableConsumer(strQueueName);
}
catch (Exception ex)
{
    // log the error message
}

アップデート

私たちのシナリオは非常に単純です。

  1. クライアントがキューを作成し、トピックでコンシューマーをサブスクライブしました。
  2. クライアント側が接続を閉じました。
  3. サーバー側のコンシューマーを削除します (前回の更新のサンプル コードのように)

jconsole 経由の activemq ブローカーのスナップショットは次のとおりです。 jconsole スナップショット

次の方法でサブスクライバー「7B0FD84D-6A2A-4921-967F-92B215E22751」を削除したいと考えていますが、常にこのエラー「javax.jms.InvalidDestinationException : 永続的なサブスクリプションが存在しません: 7B0FD84D-6A2A-4921-967F-92B215E22751」が発生しました。

strSubscriberName = “7B0FD84D-6A2A-4921-967F-92B215E22751”
session.DeleteDurableConsumer(strSubscriberName);
4

1 に答える 1

1

NMS API から永続サブスクリプションを削除するにはDeleteDurableConsumer、ISession で定義されているメソッドを使用します。このメソッドは、サブスクリプションの作成時に使用されたのと同じクライアント ID を使用する Connection から呼び出す必要があり、削除するサブスクリプションの名前を渡します。ただし、アクティブなサブスクライバーがある場合、メソッドは失敗するため、その例外に備えてください。

サンプル コードでは、接続にクライアント ID を設定しません。永続的なサブスクリプションを使用する場合は、常に同じクライアント ID とサブスクリプション名を使用する必要があります。したがって、最初にサブスクリプションを作成した接続と同じ値にクライアント ID を設定するまで、このエラーが発生します。

于 2013-04-22T19:34:03.613 に答える