0

複数の長時間実行プロセスを実装するプロジェクトを継承しました。これらの各プロセスは、ajax ポーリングを介して UI に反映されるステータス テーブルを更新します。これらのプロセスは、Rhino Service Bus (MSMQ を使用) を使用するバックグラウンド アプリケーションで実行されており、プロセスは「長いプロセスの実行」メッセージを送信することによってトリガーされます。

プロセス自体は、多数のテーブルに対してあらゆる種類のデータ操作、検証、更新、挿入、削除などを行っています。

複数のセッションと入れ子になった TransactionScopes をあちこちに配置して NHibernate セッションを実際に悪用しているようです。

NHibernate / RSB の専門家に質問したいのですが、長時間実行されているプロセスの実行中にステータス テーブルをどのように更新しますか?

私は考えました:

  • プロセスの実行中に「ステータス メッセージの更新」を送信します (NHibernate / RSB セッション管理の問題を解決する必要があります)。
  • データベース永続化機能を備えた saga を使用し、ステータス テーブルの代わりに ajax ポーリング関数にクエリを実行させる
4

1 に答える 1

0

RSB プロセス内でのステータス更新の問題は、通常、メッセージ処理がトランザクション スコープ自体の内部で発生することです。これは、データベースへの変更、または送信したメッセージは、(通常) トランザクションがコミットされる (メッセージの処理が完了したときに発生する) 場合にのみ、他のアプリケーションに表示されることを意味します。

私が通常とる 3 つのアプローチがあります。

  1. アンビエントトランザクションを抑制するTransactionScopeで更新をラップします(これが現在起こっていることだと思います)
  2. プロセスをより小さなメッセージに分割します (これにより、データベースでの競合を減らすことができますが、より多くのメッセージが飛び交うという犠牲が伴います)
  3. 他のプロセスを介して外部クライアントに通知します(たとえば、他のプロセスがクエリできるある種のリモーティングサービス/ WCF /残りのサービスを持っているか、ある種のトランザクションを無視したプロセスを介して通知を送信します)
于 2014-05-02T15:58:13.803 に答える