問題タブ [rebus]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - SqlConnection と MSDTC への昇格の回避
アプリケーションでデータベース アクセスを行う必要がある場合は、次のパターンを使用します。
- クエリを実行するために、メソッドを呼び出す
CreateOpenConnection
だけのメソッドを持つ静的ファクトリ クラスがあります。このメソッドは、クエリを実行する前に呼び出され、クエリが返された後に接続が破棄されます。new SqlConnection(myConnectionString)
Open()
work.Commit()
挿入/更新/削除の場合、次のような呼び出しで変更がバッチ処理されてデータベースに送信される Unit of Work パターンを使用します。
work.Commit:
これは、Web サービスの一部としての一般的な使用にはうまく機能するようですが、現在、これを Rebus と組み合わせて使用しようとすると、MSDTC の問題が発生します。
私が知る限り、Rebus (キュー内のメッセージを処理するとき) は新しいメッセージを作成するTransactionScope
ので、メッセージの処理に失敗した場合はロールバックできます。さて、これ自体はこれまでのところうまくいきました。SqlConnection
Rebus メッセージ ハンドラー内で問題なくnew を開くことができます (ただし、同じ Rebus 内で従来の Entity Framework クエリと手動の SqlConnections を使用TransactionScope
しても機能しませんが、現時点では問題とは考えていません)。しかし、昨日、次の質問をしました。
答えは、Rebus のサガ機能を使用することです。これを実装して、Rebus saga が新しい SQL Server データベースに永続化されるように構成してみました (個別の接続文字列を使用)。おそらく、その SQL Server の永続性を使用するSqlConnection
と、独自SqlConnection
の
分散トランザクション マネージャー (MSDTC) のネットワーク アクセスが無効になっています。コンポーネント サービス管理ツールを使用して、MSDTC のセキュリティ構成でネットワーク アクセスに対して DTC を有効にしてください。
MSDTC を有効にすることは、構成とパフォーマンスのオーバーヘッドに関して、私が非常に避けたいことです。そして、私は間違っているかもしれませんが、それは必要ではないようです.
ここで起こっていると私が推測するのは、Rebus がアンビエントTransactionScope
を作成し、SqlConnection
それが作成した がそのスコープに参加するということです。また、独自のものを作成SqlConnection
しようとすると、そのアンビエント スコープにも参加しようとし、複数の接続が関係しているため、MSDTC に昇格されますが、失敗します。
これを修正する方法についてのアイデアはありますが、それが正しいことかどうかはわかりません。私がすることは次のとおりです。
- アプリケーションの接続文字列に追加
Enlist=false
して、アンビエント トランザクションに参加しないようにします。 - メソッドを変更し
Commit
て、新しいものを作成しないようにしますTransactionScope
(接続はこれ以上サブスクライブしないと言ったので、これ以上サブスクライブしません)が、conn.BeginTransaction
.
そのようです:
これが正しいアプローチであるかどうか、および考えられる欠点が何であるかはわかりません。
任意のヒント?
更新:明確にするために、work.Commit()
問題を引き起こしているのはそれではありません。うまくいくと確信していますが、クエリが失敗するため、そこにたどり着くことはありません。
失敗するものの例:
これは、 Rebus によって aTransactionScope
が作成されたとき、および Rebus によって aSqlConnection
が開かれた後に呼び出されます。my を開くSqlConnection
と、参加しようとしてクラッシュします
rebus - Rebus に、そのインターフェイスの実装ではなくインターフェイスのエンドポイントを決定させるにはどうすればよいですか
AutoMapper.Mapper.DynamicMap() によって作成されたインスタンスを送信すると、Rebus が DynamicMap によって返されたプロキシ タイプのエンドポイントを決定しようとしているように見えるエラーが発生します。このインスタンスには、T がインターフェイス型であると仮定して、T の実装が含まれます。
DynamicMap() によって返される実装型ではなく、インターフェイス型 T のエンドポイントを Rebus に決定させる方法はありますか?
私は IDetermineMessageOwnership で遊んでみましたが、今のところうまくいきませんでした。
前もって感謝します!
c# - Rebus pub/sub: サブスクライバーからのメッセージに返信する非同期の方法は?
私は自分のアプリケーションの 1 つに Rebus を適応させようとしています。設定が簡単で、すべてうまく機能します。複数のソースからの応答を得るには、PUB/SUB 通信を実装する必要があります。だから私が作ったのは、
Saga(Publisher)
SearchProductSaga : Saga<ProductSagaData>, IAmInitiatedBy<SearchProduct>, IHandleMessages<SearchStarted>, IHandleMessages<SearchProductResponse>, IHandleMessages<SearchCompleted>
Saga の入力キューは -ProductSaga.Queue
/li>Subscriber 1
次の実行シーケンスが含まれます。Subscriber 2
同じ実行シーケンスが含まれていますが、異なるビジネス ロジックが含まれています。
SearchStarted
さて、この実装の後、私が期待していたのは、 へのメッセージを受信することで、現在実行中のサブスクライバーの数を計算できるはずSearchProductSaga
です。サブスクライバがビジネス ロジックを完了すると、SearchCompleted
サガを示すメッセージを送信します。これで完了です。そしてMarkAsComplete();
サガで実行。
しかし、私が得ている結果はかなりがっかりしています。私が見つけたのは、ハンドラーから複数回返信している場合(サブスクライバーロジックの実行シーケンスのように)、ハンドラーの実行スコープが終了すると、すべてのメッセージがパブリッシャーキューにまとめて送信されることです。
私が間違っている場合は修正し、誰かが持っている場合は解決策を提案してください。スレッドで同じことを達成できました。しかし、私はそれを自分で管理したくないので、コードから返信されたときにメッセージをキューにプッシュする非同期の方法はありますか?
rebus - 外部サーバーを使用するように Rebus を手動で構成する方法
Rebus の app.config 構成があり、動作します。
その後、configfile の代わりにコードでアドレスとエンドポイントを設定したいと思います。
これは受け入れられず、IP アドレスの設定方法がわかりません。どんな助けでも大歓迎です!
rebus - メッセージバスへの接続に使用する rebus のユーザー名を設定します
カスタムログインを持つ MVC アプリケーションがあります。Web アプリケーションにログインすると、表示名がアプリケーション内で使用するユーザー名に設定されます。
キューに接続しようとすると、メッセージキューがユーザー名を解決できないという例外を受け取ります。アプリケーションからのログイン ユーザーの代わりに、ApplicationPool ID またはサイト ID によってメッセージ キューを接続したいと考えています。別のユーザーを使用するように rebus を構成するにはどうすればよいですか (例の資格情報を設定します)?
エラーにより、次のスタックトレースが表示されます。
c# - Rebus を使用するときにメッセージの (トランスポート) ID を取得するクリーンな方法はありますか?
Rebus+RabbitMq を使用しているときに、トランスポート レベルのメッセージの Id にアクセスして、何らかのべき等メカニズムを実装するために (Id を永続化することによって) 既に処理したメッセージを追跡できるようにしたいと考えています。
ただし、メッセージの一意の ID (RabbitMq のヘッダーで使用できるもの) にアクセスする「クリーンな」方法が見つかりません。
不可能のように見えますが、Bus.Advanced.* に何かが隠されているようなものを見逃している可能性があります..
;)
rebus - FakeMessageContext が NullReferenceException をスローする
私はサガの単体テストを書こうとしています。SagaFixture を使用して Saga をホストし、FakeBus を使用しました。Saga 実行では、MessageContext を使用して戻りアドレスを取得しているため、FakeMessageContext も使用しました。
ここで、Fixture で Handle メソッドを呼び出そうとすると、NullReferenceException 型の例外がスローされます。
以下のコードを貼り付けます:
検索佐賀
SagaUnitTest
エラー スタックトレース: Rebus.SagaContext..ctor(Guid id) at Rebus.Bus.Dispatcher.DispatchToHandler[TMessage](TMessage メッセージ、IHandleMessages 1 handler) at Rebus.Testing.SagaFixture
1.Handle[TMessage](TMessage メッセージ)
rebus - rebus ハンドラーからの応答の送信中にメモリ リークが発生しました
exe で自己ホストされている rebus ハンドラーで非常に奇妙な動作が見られました。bus.send メソッドを使用して応答を送信した直後に、プロセスによって消費されるメモリが追加されます。メモリ プロファイルを使用してオブジェクト グラフを検索しようとしたところ、rebus がシリアル化された形式の応答メッセージをどこかに保持していることがわかりました。オブジェクト グラフは、ルートまでの階層の下に表示されていました。
System.Message --> CachedBodyMessage --> ストリーム
誰かがこのことを知っているなら、私にいくつかの指針を教えてください。