Spring 在长时间运行的tasklet期间,如何处理批处理数据库的防火墙不活动超时?

Spring 在长时间运行的tasklet期间,如何处理批处理数据库的防火墙不活动超时?,spring,spring-batch,Spring,Spring Batch,我有一个长时间运行的tasklet,需要几个小时才能完成。在运行批处理作业的盒子和批处理数据库之间有一个防火墙。该防火墙上的非活动超时为两小时,我们的网络团队不愿意改变这一点。因此,当长时间运行的tasklet完成并且Spring批处理以失败的状态更新数据库时,因为防火墙已经由于不活动而切断了连接。有没有办法解决这个问题 这是我的数据源: <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destro

我有一个长时间运行的tasklet,需要几个小时才能完成。在运行批处理作业的盒子和批处理数据库之间有一个防火墙。该防火墙上的非活动超时为两小时,我们的网络团队不愿意改变这一点。因此,当长时间运行的tasklet完成并且Spring批处理以失败的状态更新数据库时,因为防火墙已经由于不活动而切断了连接。有没有办法解决这个问题

这是我的数据源:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin@db_url" />
    <property name="username" value="username" />
    <property name="password" value="password" />
</bean>
更多的背景资料。此tasklet不使用此db连接。只有SpringBatch正在使用它。tasklet的任务是监视队列,并在队列为空时完成下一步。排干队列可能需要几个小时

更新:我尝试添加Oracle TCP保持活动,但仍然超时

<property name="url" value="jdbc:oracle:thin:@(DESCRIPTION=(ENABLE=BROKEN)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=hostname)(PORT=port)))(CONNECT_DATA=(SID=sidname)))" />
谢谢。
Brian不确定您的tasklet是否真的需要事务,但在我的情况下,我可以通过定义事务属性来解决这个问题:

@Bean
public Step myStep(StepBuilderFactory stepBuilderFactory, MyTasklet myTasklet) {
    return stepBuilderFactory.get("myStep").tasklet(myTasklet).transactionAttribute(new DefaultTransactionAttribute(TransactionAttribute.PROPAGATION_NEVER)).build();
}

如果要终止长时间运行的作业,有两种方法:

工作中断政策 命令行运行程序 我们可以使用JobInterruptedPolicy以编程方式终止作业,也可以通过执行命令STOP手动使用CommandLineRunner终止作业

工作中断政策

使用作业操作员。停止作业

 SimpleJobOperator jobOperator = new SimpleJobOperator();
 jobOperator.setJobRepository(jobRepository);
 jobOperator.setJobLauncher(jobLauncher);
 jobOperator.setJobExplorer(jobExplorer);
 jobOperator.setJobRegistry(jobRegistry);
 //If you know job execution id that you want to stop the job
 jobOperator.stop(exceutionId);
如果有JobExcreation对象,则可以简单地使用JobExcreation.stop方法

以上两种方法对我都很有效

Spring批处理的批处理作业执行表

批处理状态:已停止
ExitStatus:STOPPED

根据您最初获得连接的方式,我可以提出许多选择。如果您用数据源配置更新了您的问题,也就是您正在使用的连接池,我们可以从那里开始。@MichaelMinella谢谢Michael。我已经用数据源更新了原始帖子。如果您需要更多信息,请让我知道。使用Oracle,您应该能够将驱动程序配置为使用TCP keepalive,这样即使在连接等待时,它也会通过连接保持一些流量。我找不到一个直接的例子,否则,我会把它作为一个实际的答案发布。@MichaelMinella我试图添加TCP保持活动,但它仍然超时。我更新了我原来的帖子。你可能想和你的网络管理员谈谈,确切地说,他们看到了什么导致它被删除。这真的是两个小时的不活动,还是仅仅保持一个连接两个小时,不管流量如何,一些防火墙不喜欢长时间运行的连接,周期。一旦他们告诉你需要什么来防止防火墙切断连接,我们可能会进一步提供帮助。谢谢你的建议。不幸的是,我已经尝试过了,但它并没有解决我的问题。