汎用非同期Javaジョブ実行フレームワーク/ライブラリの検索
-
03-07-2019 - |
質問
Callable
または Runnable
を処理できる汎用非同期Javaジョブ実行フレームワークを探しています。これは java.util.concurrent.ExecutorService
に似ていますが(場合によっては ExecutorService
をラップします)、次の機能も備えています。
-
ジョブの処理中にアプリケーションがダウンした場合にデータベースにジョブを保持し、未完了のジョブを再開できる機能。 (私の仕事では
Serializable
を実装する必要があるかもしれないことを理解しています。これは問題ありません。) -
UUIDを使用して、クライアントがジョブトークンを取得し、ジョブのステータスを照会できるようにします。 (内部では、この情報はデータベースにも保持されます。)
ExecutorService
を中心に構築することで、この作業を自分で始めましたが、独創的なオープンソースソリューションがあればそれを希望します。
Spring Framework内で機能するものが理想的です。
解決
クォーツを使用して、具体的な Runnable
に委任する Job
アダプターまたは Callable
。 Quartzの Job
インターフェースは、タスクの呼び出し間で状態を維持する機能を追加します。必要に応じて、Quartzはジョブとその状態をリレーショナルデータベースに永続的に保存し、ホストのスケーラブルなクラスターで実行できます。
他のヒント
クォーツをご覧ください。
Quartzはフル機能のオープンソースジョブスケジューリングシステムであり、最小のスタンドアロンアプリケーションから最大のeコマースシステムに至るまで、ほぼすべてのJ2EEまたはJ2SEアプリケーションと統合、または一緒に使用できます。 Quartzを使用して、数万、数百、数万のジョブを実行するための単純または複雑なスケジュールを作成できます。タスクが標準JavaコンポーネントまたはEJBとして定義されているジョブ。 Quartz Schedulerには、JTAトランザクションやクラスタリングなどのエンタープライズクラスの機能が多数含まれています。
http://www.opensymphony.com/quartz/wikidocsをご覧ください/Features.html にアクセスして、既に何かのものがあるかどうかを確認します。
そのページから:
付属のJDBCJobStoreを使用すると、すべてのジョブとトリガーが「不揮発性」として設定されます。 JDBCを介してリレーショナルデータベースに保存されます
別の方向としては、 Terracotta を使用するなど、JVMでヒープをクラスター化して永続化する機能があります。可用性。 Terracottaは、 Quartz との統合をサポートします(スケジュールの観点から有用な場合)。 。また、マスターワーカーとメッセージング統合モジュールがあります。同様に有用であること。 Terracottaはオープンソースです。
Alexのポイントをフォローアップするために、Terracottaソリューションはデータベースにジョブを永続化せず、Terracottaの分散メモリストアに永続化されます。
Terracottaはメモリストアをディスクに永続化するため、これらのジョブをデータベースに入れるより効率的なバージョンです。
同時に、純粋なPOJOプログラミングモデルを提供するため、DB txns、ORMなどに対処する必要さえありません-特定のワークロードがDBと通信しない限り(この場合、Terracottaここであなたを助けたり傷つけたりすることはありません。ただ作品を配布するのに役立ちます。
MasterWorkerパターンは、グリッド上で作業を分散するのに役立ちます。DistributedExecutorServiceを使用すると、作業を次のように簡単に開始できます。
CompletionService executor = new DistributedCompletionService(new DistributedExecutorService("myTopologyName"));
executor.submit(new MyRunnable(), null);
...
Future f = executor.take();
マスターワーカーのクイックスタートガイドへのリンクTerracotta Forgeでの実装。
さらに-TerracottaではSerializableを実装する必要はありません-必要に応じて可能です: