私はSpring Batch Tasklet
で電子メールを送信します。チェックされていない例外の場合、バッチ処理が続行されます
SMTPサーバーがダウンしているので、チェックが外されていますMailSendException
例外が発生しました。移行
次のステップは、(電子メール送信から)として宣言されている:
FlowBuilder<Flow> flowBuilder = new FlowBuilder<Flow>("myFlow")
.from(sendNotificationStep()).next(nextStep());
とnextStep()
あってもチェックされない例外の場合に実行されます。
チェックされていない例外を無視するSpring Batch Frameworkの通常の動作ですか?
この例外は無視され、ログに記録されません(私はroot
ロガーをWARN
に設定しました)。 why does transaction roll back on RuntimeException but not SQLException
UPDATEに報告
やや反対の現象がデバッガとステッピング後、私は内側端:
public class SimpleFlow implements Flow, InitializingBean {
public FlowExecution resume(String stateName, FlowExecutor executor) throws FlowExecutionException {
state = nextState(stateName, status, stepExecution);
status
state
はsendNotificationStep
とnextState()
リターンnextStep
で、FAILED
あります。
catch
はresume
である:
catch (Exception e) {
executor.close(new FlowExecution(stateName, status));
throw new FlowExecutionException(String.format("Ended flow=%s at state=%s with exception", name,
stateName), e);
}
しかしによって以前に処理した例外:
public abstract class AbstractStep implements Step, InitializingBean, BeanNameAware {
public final void execute(StepExecution stepExecution) throws JobInterruptedException,
catch (Throwable e) {
stepExecution.upgradeStatus(determineBatchStatus(e));
exitStatus = exitStatus.and(getDefaultExitStatusForFailure(e));
stepExecution.addFailureException(e);
if (stepExecution.getStatus() == BatchStatus.STOPPED) {
logger.info(String.format("Encountered interruption executing step %s in job %s : %s", name, stepExecution.getJobExecution().getJobInstance().getJobName(), e.getMessage()));
if (logger.isDebugEnabled()) {
logger.debug("Full exception", e);
}
}
else {
logger.error(String.format("Encountered an error executing step %s in job %s", name, stepExecution.getJobExecution().getJobInstance().getJobName()), e);
}
}
バッチ管理者はABANDONED
として問題のあるステップを示しています。動作を再現する
UPDATE 3フル機能の例を(刺しを提供するためのサバー・カーンに感謝!):
@SpringBootApplication
@Configuration
@EnableBatchProcessing
public class X {
private static final Logger logger = LoggerFactory.getLogger(X.class);
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
@Bean
protected Tasklet tasklet1() {
return (StepContribution contribution, ChunkContext context) -> {
logger.warn("Inside tasklet1");
throw new IllegalStateException("xxx");
//return RepeatStatus.FINISHED;
};
}
@Bean
protected Tasklet tasklet2() {
return (StepContribution contribution, ChunkContext context) -> {
logger.warn("Inside tasklet2");
return RepeatStatus.FINISHED;
};
}
@Bean
public Job job() throws Exception {
Flow flow = new FlowBuilder<Flow>("myFlow").from(firstStep()).on("*").to(nextStep()).end();
return this.jobs.get("job").start(flow).end().build();
}
@Bean
protected Step firstStep() {
return this.steps.get("firstStep").tasklet(tasklet1()).build();
}
@Bean
protected Step nextStep() {
return this.steps.get("nextStep").tasklet(tasklet2()).build();
}
public static void main(String[] args) throws Exception {
System.exit(SpringApplication.exit(SpringApplication.run(X.class, args)));
}
}
'sendNotificationStep()'の完全なコードを表示してください。 –
他の例外は無視されませんか?誤ってskippable-exception-classes(またはFaultTolerantStepBuilder.skip())を使用して春バッチ設定で例外をスキップすることはありませんか? – qtips