1

NES 0.3(https://github.com/elliotritchie/NES)を試していますが、何が起こるかを理解するのに問題があります。EventStoreの構成をSQLサーバーに変更し、実行がSendMessageCommandHandler.Handle()を終了する直前に例外を挿入したサンプルアプリケーションを実行しています。

次に、ハンドラーとWebサイトを起動します。うまくいく新しいユーザーを作成します。EventStoreテーブルに登録された1つのイベント。それから私はメッセージを送ろうとします。これは私の例外のために失敗します。したがって、バスのトランザクションの性質により、NServiceBusイベントはディスパッチされていません。ただし、EventStoreでは、イベントが登録され、dispatched=1のマークが付けられます。

私は何が欠けていますか?確かに、NServiceBusによってディスパッチされていないときに、ディスパッチとして登録されているべきではありませんか?エラーキュー内の唯一のメッセージは「SendMessageCommand」です。おそらく私の理解が間違っているので、これを著者に問題として報告する前に、ここで質問したいと思いました。

4

2 に答える 2

1

内部的には、NESはEventStoreプロジェクトを使用します。設計上、MarkAsDispatched()が呼び出されるまで、各コミットはディスパッチされたとは見なされません。その結果、予期しない場所で何かがそのメソッドを呼び出していると推測されます。

何よりもまず、EventStoreの単一インスタンスを実行していますか。2つのインスタンスが実行されていないことを確認してください。それを超えて、コミットがディスパッチされたとマークされている時点を見つけるために、ハンドラーをステップスルーすることをお勧めします。

于 2011-08-25T19:49:32.883 に答える
1

0.3.0.1バージョンのNEShttp://nuget.org/List/Packages/NESはすべてのハンドラーが正常に実行された後にのみ変更をコミットするようになりました。

ただし、メッセージの同一性を自分で管理することを検討する必要があります。これはいくつかの方法で実行できます。

EventStoreは、データベースに変更をコミットするときに、デフォルトでアンビエントトランザクションを抑制します。ただし、SQL ServerまたはRavenを使用している場合は、EventStoreのTransactionScopeOptionをRequiredに変更できます。これにより、トランザクションがMSDTCを使用して分散され、すべてが自動的に処理されるようになります。

2PCを使用する代わりに、受信したすべてのメッセージのログを保持し、これを使用して特定のメッセージの処理を承認/拒否することもできます。このアプローチの例はここにあります:http://blog.jonathanoliver.com/2010/04/extending-nservicebus-avoiding-two-phase-commits/

于 2011-08-28T13:43:55.920 に答える