【问题标题】:Spring batch exit message on workflow failure工作流失败的Spring批处理退出消息
【发布时间】:2021-05-10 16:35:08
【问题描述】:

我有一个 Spring 批处理步骤执行一个 tasklet,它轮询远程服务器上的文件:

public class MyConfiguration extends AbstractConfiguration {
   
    @Bean
    @Qualifier("pollStep")
    public Step pollStep() {
        return stepBuilderFactory.get("pollStep")
                                 .tasklet(filePollingTasklet())
                                 .listener(promoteContextListener())
                                 .build();
    }

    @Bean
    @StepScope
    private Tasklet filePollingTasklet() {
        return ((stepContribution, chunkContext) -> getStatus(stepContribution, chunkContext));
    }

    private RepeatStatus getStatus(StepContribution stepContribution, ChunkContext chunkContext) {
        //some code
        Map<String, Boolean> result = poller.pollForFile(myContext, sourceInfo);
        return RepeatStatus.FINISHED;
    }

}

轮询长达 100 分钟,每隔一段时间重试一次...

当它在pollForFile()方法中对文件进行while循环轮询时,如果找不到文件,它会抛出一个RuntimeException

spring批处理STEP EXECUTION表记录了该步骤的EXIT MESSAGE,但在这种情况下批处理失败时异常如下:

org.springframework.transaction.TransactionSystemException: Could not roll back JPA transaction; nested exception is org.hibernate.TransactionException: Unable to rollback against JDBC Connectionat org.springframework.orm.jpa.JpaTransactionManager.doRollback(JpaTransactionManager.java:565)at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:835)at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:809)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:127)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)at com.sun.proxy.$Proxy177.rollback(Unknown Source)at org.springframework.transaction.support.TransactionTemplate.rollbackOnException(TransactionTemplate.java:168)at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:144)at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:273)at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:82)at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:375)at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:145)at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:258)at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:208)at org.spring

我想了解为什么退出消息是 jpa 回滚错误而不是运行时异常?在这种情况下,如何确保运行时异常消息是当步骤失败时存储在 Spring 批处理表的 Exit Message 中的内容。

【问题讨论】:

    标签: java spring spring-batch


    【解决方案1】:

    我想了解为什么退出消息是 jpa 回滚错误而不是运行时异常?

    因为这实际上是使您的步骤失败的原因。您共享的堆栈跟踪被截断,但运行时异常应该是导致org.springframework.transaction.TransactionSystemException 的原因,而这又是导致您的步骤失败的原因。

    【讨论】:

    • 谢谢,如何避免这个错误?我是否在某处错误配置了我的步骤?
    • 除非您捕获代码周围的运行时异常并决定如何处理它们,否则您无法避免此错误(如果事务失败,则该步骤也会失败)。
    • 由于长时间运行的 tasklet,与我的 sqlserver 数据库的连接似乎正在重置或超时。在这种情况下,如果我增加 sql server 重置的超时间隔,这是否就足够了,或者是否有设置可以保持连接处于活动状态?
    • 这是另一个问题,与最初的问题无关。我看到你在这里问过:stackoverflow.com/questions/67491044/…。请在此处接受此答案,因为我相信它回答了您最初的问题,我会尽力帮助解决另一个问题。
    • 感谢您是否可以帮助解决我已经困扰了一段时间的另一个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    相关资源
    最近更新 更多