フレームワーク概要と核心機能
PowerJobはJavaで設計されたエンタープライズ向け分散タスクスケジューリングプラットフォームです。Webコンソールを介した視覚的な操作を可能にし、導入障壁が低いことを特徴としています。主な技術的特徴は以下の通りです。
- 直感的なUI管理: タスクの登録・削除・更新、実行ステータスの可視化、リアルタイムログの確認をブラウザ上で完結します。
- 柔軟なトリガー設計: CRON式、固定間隔、固定遅延、APIコールバックの4種類に対応し、業務要件に合わせたスケジュール制御が可能です。
- 多様な実行モード: ノード単独実行、全ノード一斉実行、分割処理(Map)、および分散計算(MapReduce)をサポートします。設定によりクラスタレベルの並列処理能力を容易に構築できます。
- DAGワークフローエンジン: タスク間の依存関係をグラフ形式で定義可能。条件分岐やサブワークフローのネスト、上下游間のデータ引き継ぎにも対応しています。
- 広範なプロセッサ互換性: Spring Beanだけでなく、外部Javaクラス、Shell、Python、HTTP、SQLなどへの拡張も公式スターター経由で容易に実装可能です。
- ロックフリーアーキテクチャ: 競合を回避する独自のスケジューリングアルゴリズムを採用。複数インスタンスのデプロイにより水平スケーラビリティと高可用性を両立させます。
- 自動フェイルオーバー: 実行障害時における再試行ポリシーの適用と、余剰ノードへのタスク転送機能により、サービス継続性を担保します。
サーバー環境の構築と初期設定
Docker Composeまたは直接JARファイルを実行する方式のどちらでも利用可能です。本項では標準的なJAR展開手順を解説します。
- GitHubよりソースコードをCloneし、リリースページから安定版バイナリを取得します。
- MySQLなどのリレーショナルデータベースを作成し、PowerJob用のスキーマを初期化します。
CREATE DATABASE IF NOT EXISTS powerjob_prod DEFAULT CHARSET utf8mb4;
- 設定ファイル
application-daily.properties(※環境に応じてpreやproductも用意)を開き、DB接続情報を変更します。 PowerJobServerApplicationを実行し、ブラウザでhttp://localhost:7700にアクセスしてログイン画面が表示されるか確認します。- 管理画面より新規ワーカーアプリケーションを登録します。ここで設定した「アプリ名(App Name)」は後述するクライアント側設定と完全に一致させる必要があります。
本番環境へのデプロイには、テストケースの一時的な無効化が必要な場合があります。その際はSurefireプラグインの設定を更新し、mvn clean packageでビルドを実行してください。生成されたJARファイルを対象サーバーへ配置し、通常のコマンドで起動即可です。
クライアント側の統合実装
Spring Bootベースのプロジェクトにて、以下のような連携構成を構築します。
Maven依存関係の追加
<dependency>
<groupId>tech.powerjob</groupId>
<artifactId>powerjob-worker-spring-boot-starter</artifactId>
<version>4.3.2</version>
</dependency>
プロパティ設定
powerjob.worker.enabled=true
powerjob.worker.port=27777
# サーバー登録時に付与したAppNameと同一であること
powerjob.worker.app-name=batch-job-agent
# スケジューラーサーバーのエンドポイント
powerjob.worker.server-address=127.0.0.1:7700
# 推奨プロトコル
powerjob.worker.protocol=http
# リザルト文字列の最大長制限
powerjob.worker.max-result-length=4096
タスクロジックの定義
アプリケーションエントリポイントにてアノテーションを有効化し、インターフェースを実装する形でジョブ本体を作成します。
@Configuration
@EnableScheduling
public class SchedulerConfig {}
@Component
public class DataProcessingHandler implements BasicProcessor {
@Override
public ProcessResult process(TaskContext context) throws Exception {
String incomingPayload = context.getJobParams();
System.out.println("受信パラメータ: " + incomingPayload);
System.out.println("ジョブ実行フェーズ開始");
// 実際のバッチ演算や外部システム呼び出しはこの位置に記述
return new ProcessResult(true, "プロセス正常終了");
}
}
クライアントを起動すると、自動Discovery機能によりサーバー側「マシンインスタンス」一覧にノードが登録されます。Web管理画面上でジョブ作成時、「プロセッサ名(Handler)」フィールドには上記クラスの完全修飾パスを入力してください。保存後、スケジュールに従いタスクが発火すると、コンソール出力と同時にWeb画面の実行履歴タブにログが反映されます。
詳細設定と実行戦略の最適化
タスク新規作成画面では、運用要件に応じた複数のパラメータチューニングが可能です。
- トリガータイプ: API手動発火、CRON定周期、固定間隔/遅延、ワークフロー連携からのイベント駆動など、複数種の方式から選択可能です。
- 有効期間(Life Cycle): ジョブの活動範囲を特定の日付帯に制限できるため、メンテナンスウィンドウや期間限定の処理適応に最適です。
- 実行モードの詳細比較:
- Single: 任意のアイドルノードで単一回実行。
- Broadcast: クラスター内の全アクティブノードへ同時配信(共通キャッシュクリア等)。
- Map: 入力レコードをキー単位で分割し、並列処理。単純な抽出・変換処理に最適。
- MapReduce: 大規模データセットに対して分割(Map)と集約(Reduce)の二段階処理を実行。統計集計や重負荷計算に向きます。
- ランタイム制御: ノード選出戦略(
HEALTH_FIRST優先 vsRANDOM均等配布)、最大並列インスタンス数、スレッドプールサイズ、タイムアウト閾値などを細かく指定可能です。