2

私は Tibco EMS サーバー、いくつかのトピック、およびこのトピックへの永続的なサブスクリプションの数 (すべてのトピックに対して複数) を持っています。私の仕事は、特定の永続サブスクライバーのメッセージを (適切な確認モードで受信することによって) 削除することです。私の質問: サブスクライバーの保留中のメッセージを自分のサブスクライバー (同じ名前、ID) に「置き換える」ことで管理できますか? また、トピックの保留中のメッセージに影響を与えないことが重要です。つまり、1 つのトピック サブスクリプションから一部のメッセージを削除し、それらのメッセージを他のトピック (同じトピック) サブスクリプションに残します。

4

1 に答える 1

0

さて、私は答えを見つけましたが、前に投稿するのを忘れていました。

上記のように、質問自体の下で、トピックからメッセージを削除する方法はありません。ただし、特定の永続サブスクリプションでメッセージを削除するという、少し異なるタスクがありました。そして、これは本当です(いくつかの条件付きで)。

たとえば、永続サブスクリプション「MySubscr」からメッセージを削除する必要があるとします。そのためには、接続を作成し、同じ名前「MySubscr」で永続サブスクライバーを作成する必要があります。しかし、それだけでは十分ではありません。そうするだけで、別の永続的なサブスクライバーが同じ名前で作成されますが、別のClientIDに接続されます。また、必要な「MySubscr」持続性に影響を与えることなく、スタンドアロンの持続性接続として動作します (実際には、MySubscr:123 と MySubscr:567 持続性サブスクリプションのように見えます。少なくとも TibcoEMS の場合、123 と 567 は ClientID です)。これを修正するには、 connection.setClientID()メソッドを使用して ClientID を接続に明示的に設定する必要がありますが、最初の接続が接続されていない場合にのみ行うことができます (その '永続サブスクライバーの場合、サブスクライバーが接続されていなくてもメッセージを蓄積できます)。

したがって、サブスクライバーがそれ自体で切断されるまで待つ必要があります ( TibcoEMS のisConnected()メソッド、JMS API で同様のメソッドは見当たりませんでしたが、ほとんどの実装にはこのようなものがあると仮定します) または手動で (特定の ClientID を使用して) 接続を破棄します ( TibcoEMS の TibjmsAdmin.destroyConnection()メソッド)。その後、ClientID を接続に設定し、このサブスクライバーのメッセージにアクセスします。メッセージは、確認応答モード クライアント (トピックに残ります) または自動モード (削除されます) を使用してメッセージを読むことができます。

重要な注意:特定のメッセージを消費することはできません。すべてのメッセージはキューのように消費されるため、1 つずつしか実行できません。不要なメッセージを見つけて、それを削除したい場合 (自動確認モードで消費するか、メッセージのacknowledge()メソッドを呼び出すことにより)、それ以前のすべてのメッセージが失われます。私の知る限り、以前のメッセージを削除せずにメッセージを削除する方法はありません。

もう 1 つの重要な注意事項:メッセージ マジックを実行している間は、接続が閉じられるまで最初のクライアントが再接続しないようにすることが重要です。サブスクリプションからの以前のメッセージにはアクセスできません。

于 2014-10-27T13:48:24.240 に答える