我在一个步骤后回顾了Spring批处理流/拆分,发现(a)标记的解决方案没有解析,因为拆分无法实现,(b)我的用例不同,因此答案的意图不同。
我还回顾了如何使用spring批处理并行步骤拆分流配置上述用例?,但解决方案是增加并行化,而不是拆分和连接线程。
这似乎是一个足够常见的用例,应该是一个常见问题,但我还没有看到解决方案。
我有一个并行的spring批处理作业,我想在其中添加设置和拆卸步骤。安装和拆卸是单线程的,但主体工作是并行的。
随着时间的推移,以不同的方式绘制事件:
start setup
|
split -------
| |
some other
stuff stuff
| |
join -------
|
finish teardown
我从spring批处理作业XML开始:
<batch:job id="myJob">
<batch:step id="step0001-setup">
<batch:tasklet transaction-manager="jtaTransactionManager"
start-limit="100" allow-start-if-complete="true">
<batch:chunk reader="beforeJobScriptExecutor" writer="dummySinkWriter"
commit-interval="1" />
</batch:tasklet>
</batch:step>
<batch:split id="split1" task-executor="taskExecutor" next="step9999">
<batch:flow>
<batch:step id="step0003-one-thread"
allow-start-if-complete="true">
<batch:tasklet transaction-manager="jtaTransactionManager"
start-limit="100">
<batch:chunk reader="myReader1" writer="myWriter1"
commit-interval="1" />
</batch:tasklet>
</batch:step>
</batch:flow>
<batch:flow>
<batch:step id="step0002-another-thread">
<batch:tasklet transaction-manager="jtaTransactionManager"
start-limit="100">
<batch:chunk reader="myReader2" writer="myWriter2"
commit-interval="1" />
</batch:tasklet>
</batch:step>
</batch:flow>
</batch:split>
<batch:step id="step9999">
<batch:tasklet transaction-manager="jtaTransactionManager"
start-limit="100" allow-start-if-complete="true">
<batch:chunk reader="afterJobScriptExecutor" writer="dummySinkWriter"
commit-interval="1" />
</batch:tasklet>
</batch:step>
</batch:job>
本文主要概述了解决方案:如何使用决策器终止Spring批处理分割流中的步骤
spring批处理作业的最终文本如下:
<batch:job id="myJob">
<batch:step id="step0001-setup">
<batch:tasklet transaction-manager="jtaTransactionManager"
start-limit="100" allow-start-if-complete="true">
<batch:chunk reader="beforeJobScriptExecutor" writer="dummySinkWriter"
commit-interval="1" />
</batch:tasklet>
<batch:end on="FAILED" />
<batch:next on="*" to="split1" />
</batch:step>
<batch:split id="split1" task-executor="taskExecutor" next="step9999">
<batch:flow>
<batch:step id="step0003-one-thread"
allow-start-if-complete="true">
<batch:tasklet transaction-manager="jtaTransactionManager"
start-limit="100">
<batch:chunk reader="myReader1" writer="myWriter1"
commit-interval="1" />
</batch:tasklet>
</batch:step>
</batch:flow>
<batch:flow>
<batch:step id="step0002-another-thread">
<batch:tasklet transaction-manager="jtaTransactionManager"
start-limit="100">
<batch:chunk reader="myReader2" writer="myWriter2"
commit-interval="1" />
</batch:tasklet>
</batch:step>
</batch:flow>
</batch:split>
<batch:step id="step9999">
<batch:tasklet transaction-manager="jtaTransactionManager"
start-limit="100" allow-start-if-complete="true">
<batch:chunk reader="afterJobScriptExecutor" writer="dummySinkWriter"
commit-interval="1" />
</batch:tasklet>
</batch:step>
</batch:job>
当我查看Spring Batch留档以并行执行步骤时,我只看到它通过XML的配置,如下所示。 我正在使用Spring批处理编写一个应用程序,我也使用了Spring Boot,我的所有配置都是使用注释完成的。是否有一个我可以使用Java配置来配置拆分步骤的方法?我查看了Spring Batch中Step interface的API文档,但它没有Split Step的默认实现。有没有办法使用现有的默认
是否可以在Spring批处理中动态配置作业? 这是我想做的。我创建了几个不同的,如下所示: FlatFileItemReader 我希望能够在创建批处理作业时动态混合和匹配它们。例如,假设我需要一个有2个步骤的作业。第一步包含一个用于预处理的。第二步将有一个,用于使用我的阅读器/写入器进行基于块的数据处理......类似这样的东西: 在XML中,我可以执行以下操作: 但是我如何像上面一样以编程方式
但是我只想执行一次,@在场景大纲之前,@在场景大纲之后!在cucumber-JVM中有什么方法可以实现这一点吗?
我希望在我的应用程序中定义多个,并尝试将它们模块化,如下所示: 从sysout中,我可以看到创建了两个作业bean。 那么为什么找不到读者呢?我的意思是:除了将bean方法本身命名为,并将其注入变量名之外,我还能做些什么呢? SideNote:当我删除模块化并在上使用时,job运行良好。所以我很确定作业和阅读器的配置应该是正确的。但是当然我不能在下面运行类似的jobclass,所以我希望启用模块化
当编写器抛出异常时,我希望能够将步骤和作业状态设置为失败。在做了一些调试和检查Spring批处理源代码后,我注意到配置了一个,它认为是一个致命的异常,因此将作业状态设置为FAILED,所以我将代码包装在我的编写器中的一个try-get中,将包装在中,现在作业和步骤状态设置为FAILED,这是我想要的。我不确定这是否是正确的方法,因为我在任何地方都找不到它的文档,的留档也没有提到它。所以,问题是:这
Spring docs表示,需要手动为WebClient配置http客户机以设置超时:https://docs.Spring.io/Spring/docs/current/spring-framework-reference/web-reactive.html#webflux-client-builder-reactor-timeout。但是,由于WebClient返回反应单声道,所以可以(在AP