私の環境では、長時間実行されるタスクをスケジュールする必要があります。現在実行中のタスクのリストをクライアントに表示し、新しいタスクをスケジュールできるアプリケーションAがあります。実際のハードワークを行うアプリケーションBもあります。
そのため、アプリAはアプリBでタスクをスケジュールする必要があります。共通しているのはデータベースだけです。最も簡単な方法は、タスクのリストを含むテーブルを追加し、アプリBにそのテーブルをときどきクエリして、新しくスケジュールされたタスクを実行させることです。
それでも、それはそれを行う適切な方法ではないようです。一見すると、エンタープライズ環境でのジョブのツールはメッセージキューのように見えます。アプリAはタスクの説明を含むメッセージをキューに送信し、アプリBはキューからメッセージを読み取ってタスクを実行します。このような場合、アプリBが完了したタスクのステータスを書き込む上記のようなテーブルを作成せずに、アプリAがスケジュールされたすべてのタスクのステータス(永続キュー?)を取得することは可能ですか?また、アプリAには複数のインスタンスが存在する可能性があり、それぞれがすべてのインスタンスのすべてのタスクについて知っている必要があることにも注意してください。
「テーブルアプローチ」の欠点は、DBポーリングが必要なことです。
「メッセージキューアプローチ」の欠点は、インフラストラクチャに新しい通信チャネルを導入していることです(失敗する可能性のあるもう1つのこと)。
どう思いますか?他のアイデアはありますか?アドバイスをよろしくお願いします:)
==========更新==========
最終的に、私は次のアプローチを決定しました。この問題には2つの側面があります。1つはAとBの間の通信です。もう1つは、タスクに関する情報を取得することです。
通信の場合、ジョブに適したツールはJMSです。データを取得するための適切なツールはデータベースです。そのため、アプリAにタスクを説明する「tasks」テーブルに新しい行を追加させます(後でこのテーブルをクエリして、すべてのタスクのリストを取得できます)。次に、AはJMSを介してBにメッセージを送信し、「やるべきことがあります」とだけ伝えます。Bは作業を行い、テーブルのタスクステータスを更新します。
すべての回答ありがとうございます!