2

キュー (Oracle AQ) からのメッセージをリッスンし、それらを別のキュー (Tibco EMS) に送信して、Tibco プロセス (BW) で処理する Java バッチを作成しています。

問題は、Oracle AQ ドライバーがいくつかのプロパティをメッセージ (JMSXGroupID、JMSXGroupSeq) に自動的に追加することです。これらのプロパティは、Tibco プロセスによって処理されるときにエラーを引き起こします。これらの値が正しくないためです。JMSXGroupSeq は int である必要がありますが、null に設定されています。メッセージのプロパティを解析しようとすると、Tibco でエラーが発生します...

したがって、すべてのメッセージからこれら 2 つのプロパティのみを削除したいのですが、jms API は clearProperties() メソッドのみを提供し、単一のプロパティ削除メソッドは提供していないようです (私は javax.jms.Message インターフェイスを使用しています)。

今のところ、2 つの解決策を確認できます。

  1. これら 2 つのプロパティに正しい値を設定します。これは、Tibco がこれ以上使用しないと想定しているためです。

  2. すべてのプロパティを読み取り、問題を引き起こす 2 なしでメッセージを再構築します。しかし、このアプローチは非常に醜いです...

誰にも他の解決策がありますか?

4

2 に答える 2

10

一部のプロパティは編集/クリアできません。書き込みアクセスを取得するには、ここで説明されているように clearProperties メソッドを呼び出す必要があります。

メッセージが作成 (送信) されると、そのプロパティは読み取り専用になります。プロパティは変更できません。コンシューマーは、プロパティ アクセサー メソッド (getProperty( )) を使用してプロパティを読み取ることができますが、ミューテーター メソッド (setProperty( )) を使用してプロパティを変更することはできません。コンシューマがプロパティを設定しようとすると、mutator メソッドは javax.jms.MessageNotWriteableException をスローします。

メッセージが受信されると、そのプロパティを変更できる唯一の方法は、clearProperties( ) メソッドを使用してすべてのプロパティをクリアすることです。これにより、メッセージからすべてのプロパティが削除され、新しいプロパティを追加できるようになります。メッセージが送信されると、個々のプロパティを変更または削除することはできません。

于 2014-01-20T08:34:24.013 に答える
0

public void removeProperty(String name)javax.jms.Message インターフェースの具象クラス実装に関数があります。このクラスはプロバイダー固有です (あなたの場合は Tibco EMS)。クローズドソースであるため、その機能の存在については確信が持てません。ただし、HornetQ には存在します。特定のヘッダー プロパティをリセットするために使用できます。

それ以外は、オプション 1 が最適です。これを、Tibco EMS のメッセージ ヘッダー パーサーで受け入れられる null 以外の値に設定します。

于 2014-01-17T14:01:30.233 に答える