情報メッセージでフィードバックを提供する
Spring Batch ジョブは長時間実行される可能性があるため、進行状況の情報を提供することが重要な場合がよくあります。例: バッチジョブの一部またはすべての部分が失敗した場合、利害関係者に通知する必要がある場合があります。Spring Batch は、以下を通じて収集されるこの情報をサポートします。
アクティブポーリング
イベント駆動型リスナー
Spring Batch ジョブを非同期で (たとえば、ジョブ起動ゲートウェイを使用して) 開始すると、JobExecution インスタンスが返されます。JobExplorer を使用して JobRepository から JobExecution の更新されたインスタンスを取得することにより、JobExecution.getJobInstanceId() を使用してステータスの更新を継続的にポーリングできます。ただし、これは最適ではないと考えられており、イベント駆動型のアプローチが推奨されます。
Spring Batch は、最も一般的に使用される 3 つのリスナーを含むリスナーを提供します。
StepListenerChunkListenerJobExecutionListener
次の図に示す例では、Spring Batch ジョブが StepExecutionListener で構成されています。Spring Integration は、イベントの前後に任意のステップを受け取り、処理します。例: Router を使用して、受信した StepExecution をインスペクションできます。その インスペクションの結果に基づいて、さまざまなことが発生する可能性があり (メッセージをメール送信チャネルアダプターにルーティングするなど)、何らかの条件に基づいてメール通知を送信できます。

次の 2 つの部分の例は、StepExecution イベントのメッセージを Gateway に送信し、その出力を logging-channel-adapter に記録するようにリスナーを構成する方法を示しています。
まず、通知統合 Bean を作成します。
Java
XML
次の例は、Java で通知統合 Bean を作成する方法を示しています。
@Bean
@ServiceActivator(inputChannel = "stepExecutionsChannel")
public LoggingHandler loggingHandler() {
LoggingHandler adapter = new LoggingHandler(LoggingHandler.Level.WARN);
adapter.setLoggerName("TEST_LOGGER");
adapter.setLogExpressionString("headers.id + ': ' + payload");
return adapter;
}
@MessagingGateway(name = "notificationExecutionsListener", defaultRequestChannel = "stepExecutionsChannel")
public interface NotificationExecutionListener extends StepExecutionListener {}@IntegrationComponentScan アノテーションを構成に追加する必要があります。 |
次の例は、XML で通知統合 Bean を作成する方法を示しています。
<int:channel id="stepExecutionsChannel"/>
<int:gateway id="notificationExecutionsListener"
service-interface="org.springframework.batch.core.listener.StepExecutionListener"
default-request-channel="stepExecutionsChannel"/>
<int:logging-channel-adapter channel="stepExecutionsChannel"/>次に、ジョブを変更して、ステップレベルのリスナーを追加します。
Java
XML
次の例は、Java でステップレベルのリスナーを追加する方法を示しています。
public Job importPaymentsJob(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new JobBuilder("importPayments", jobRepository)
.start(new StepBuilder("step1", jobRepository)
.chunk(200, transactionManager)
.listener(notificationExecutionsListener())
// ...
.build();
)
.build();
}次の例は、XML でステップレベルのリスナーを追加する方法を示しています。
<job id="importPayments">
<step id="step1">
<tasklet ../>
<chunk ../>
<listeners>
<listener ref="notificationExecutionsListener"/>
</listeners>
</tasklet>
...
</step>
</job>