2

DBに複数行格納された巨大なファイルを処理する必要があるアプリケーションを開発しています。処理を複数の JMS クライアントに分割して、各クライアントが独自の共有を取得して個別に処理できるようにすることができます。すべての JMS クライアントがそれぞれの役割を完了したかどうかを判断するにはどうすればよいですか? すべての JMS クライアントがタスクを完了したら、処理フローの別のステップをトリガーする必要があります。JMS クライアントとして MDB を使用しています。

実際、データベースで個々のタスクのステータスを収集しています。しかし、そのようなマスターはありません。流れはこんな感じ。

  1. システムの一部はファイルをチャンクで受け取り、DB に保持します。

  2. 次のステップでは、このファイルを N 個のパーティションに論理的に分割し、パーティションのメタ データを JMS メッセージとして送信します。

  3. その後、JMS クライアントはファイルの一部を処理し、処理が完了すると、DB の別のテーブルでタスクのステータスを更新します。

しかし、次のステップをトリガーするにはどうすればよいでしょうか? 1 つの JMS クライアントは、他のすべてのクライアントが自分の役割を終えたことをどのように知ることができますか。または、どうすればここでマスターを雇うことができますか?

4

4 に答える 4

1

すべてのサブプロセスに部分的なソリューションを登録するには、Blackboard アーキテクチャ パターンを使用すると便利な場合があります。詳細については、この記事を参照するか、Google で検索してください。

于 2012-12-11T19:07:04.947 に答える
1

アプリケーションレベルでそれを行うことができます。各ワーカーは、タスクが完了したときに通知を作成する必要があります。通知を特別な JMS キューにプッシュするか、データベースに格納することができます。これはアプリケーションによって異なります。通知には、タスクを作成したマネージャーが作成したタスク ID が含まれている必要があります。したがって、他のコンポーネント (またはマネージャー) は、作成されたすべてのタスクが終了したかどうかを確認できます。

于 2012-12-11T19:05:20.833 に答える
1

このDZone 公開記事では、JGroups を使用して同様のモデルを実装する方法について概説しています。著者の意図は、JMS 実装よりも JGroups を使用することのいくつかの利点を示すことでしたが、一般的なパターンとして、うまく文書化されているので、役に立つかもしれません。

于 2012-12-11T20:27:53.913 に答える
1

私なら、JMS クライアントに、データを処理できる速さでプルしてもらいます。たとえば、FooDataSourceRequestこれと呼ばれるキューを作成して、クライアントがメッセージを投稿してデータを要求できるFoodDataSourceResponse場所にし、データを含む応答メッセージが置かれる別のキューを呼び出します。

jms Reply To キューまたは相関 ID を使用して、データ コンシューマーにデータを取得させることができます。このようにして、次に処理するチャンクの追跡を担当する JMS プロデューサーを 1 つ持つことができます。

興味深いのは、どのチャンクが処理され、どのチャンクが処理されていないかを追跡することです。分散トランザクションを使用してデータをキューに入れ、データベースを更新する必要があるかもしれません...など?

于 2012-12-11T19:33:44.987 に答える