我正在使用异步 JobLauncher 在 Spring Batch 中配置一个(长时间运行的)作业,并且我有两个 REST 端点:
在 /status 端点,我想通知客户端过程中发生的任何异常。 但是,我无法像使用同一作业的同步版本那样检索它们:
jobExecution.getAllFailureExceptions() --> empty list
stepExecution.getFailureExceptions() --> empty list
有没有办法告诉 Spring Batch 存储异常堆栈跟踪(或至少是异常消息),以便我以后可以检索它?
谢谢 朱利奥
失败异常在作业执行完成后添加(更准确地说是就在作业即将完成之前)。因此在作业运行时它们不可用。这就是为什么当作业在后台异步运行时调用
/status
端点无法获取它们的原因。
这同样适用于步骤失败异常,但是一旦步骤完成,这些异常就应该可用(而最终的后续步骤仍在运行,周围的作业也是如此)。
使用 Remote Chunking 时也会发生同样的情况。您无法将 FaultTolerance 与 SkipPolicy 一起使用,管理器配置不会选择侦听器。
对于您的特殊情况,非常遗憾我不得不使用例如:StepExecutionListener 并使用 afterStep 从 ExitStatus 获取 exitDescription。那么最好的解决方案是使用 Worker 并在那里处理异常。