0

私は weblogic 10.3 を使用しています。jdbc ストア (Oracle DB) に裏打ちされた永続的なメッセージを使用して、永続的なサブスクリプションを構成しようとしています。MDB が永続サブスクライバーとしてリッスンしているトピックがあります。シナリオ 1 の下: メッセージを送信すると、MDB にヒットします。

シナリオ 2 では、トピックに送信されたメッセージが MDB (唯一の登録済み永続サブスクライバー) によって消費されない限り、メッセージが保持されることを期待して MDB を一時停止します。しかし、メッセージをトピックに送信すると、そこに一時的に表示されてから消えます (HermesJMS を使用して表示されます)。

メッセージは MDB によって消費されていないため、この場合は JDBC ストアにログインされるという印象を受けましたが、oracle db の WLSTORE テーブルにもメッセージが保持されません。

後で、管理コンソールのトピック > 恒久サブスクライバー > メッセージを表示 にメッセージが表示されることがわかりました。

どうやら何が起こっているのかというと、トピックはメッセージを保持しませんが、その下に登録されている永続的なサブスクリプションは、メッセージが消費されるまでそれを保持します。

質問 -1) しかし、メッセージが Oracle ベースの jdbc ストアに送信されないという事実は、まだ意味がありませんか? ここで何が間違っていますか?

質問 -2) MDB を再開してメッセージのリッスンを開始しても、(管理コンソールで) 永続的なサブスクライバーの下ですべてのメッセージがそのままトピックに表示され続けます - 処理されたときにそこから削除されることを望んでいました唯一の登録済み永続サブスクライバーによって。

4

2 に答える 2

1

トピックとキューは異なる通信モデルであるため、メッセージはトピックに表示されません。A と B の 2 つの (永続的な) サブスクライバーを持つ永続的なトピックがあるとします。両方にメッセージを取得させたいとします。確実にするには、A と B の両方がメッセージを受信したことを確認する必要があります。これは、すべてのメッセージが再配信される理由でもあります。再接続後、MDB はメッセージに対して commit() を呼び出して、処理が完了したことをサーバーに通知する必要があります。これは、トピック自体がメッセージを保存しない理由も説明しています。メッセージは永続的なコンシューマーごとに保存されます。A はメッセージをコミットする可能性がありますが、B はそうしないためです (「オフライン」である可能性があります)。そのため、消費者ごとにコピーが必要です。

于 2013-01-24T12:32:18.573 に答える
0

私はさらなるテストでいくつかの興味深いものを見つけました-

質問1の場合)_ weblogic 10でJMSサーバーのjdbcストアを構成しなくても、独自のデフォルトのファイルストアがあり、構成なしで常に機能します。このファイルストアは、永続サブスクリプションの永続メッセージを保存するために使用され、そのストアはサーバーの再起動後もメッセージを保持します。

詳細については、http://docs.oracle.com/cd/E17904_01/web.1111/e13701/store.htm#i1130575をご覧ください。

質問2)_私のMDBは、特定の形式のXMLメッセージを期待していました。テスト中に、物事を単純にするために、小さなテキストメッセージを送信し始め、MDBで正常に処理されないことを忘れました。そのため、MDBはこれらすべてのメッセージで失敗し、トランザクションをロールバックしていました。そのため、MDBを再開したときにメッセージが削除されることはありませんでした。

これは私の両方の質問にほぼ答えます。

于 2013-01-24T19:48:24.703 に答える