- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Spring 批处理的新手。我创建了一个决策程序,它将 FlowExecutionStatus 返回为"is"/“否”。根据 FlowExecutionStatus
,我需要调用 step2()
或 step3()
。
在我下面的代码中,step2()
在 decider 之前被调用。如何修改代码以便根据决策程序返回的 FlowExecutionStatus
调用决策程序,step2()
或 step3()
应该被调用。请帮忙。
@Autowired
private NumberDecider decider;
@Bean
public Job NumberLoaderJob() throws NumberFormatException, IOException {
return jobBuilderFactory.get("numberLoaderJob").start(step1()).listener(new MyNumberJobListener())
.next(decider).on("YES").to(step2())
.from(decider).on("NO").to(step3()).end().build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1").tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("Exiting step1() execute()");
return RepeatStatus.FINISHED;
}
}).build();
}
/**
* Step 2
*
* @return
* @throws NumberFormatException
* @throws IOException
*/
@Bean
public Step step2() throws NumberFormatException, IOException {
return stepBuilderFactory.get("step2").listener(new MyStepListener())
.<OrderNumber, OrderNumber>chunk(Integer.valueOf(chunkSize)).faultTolerant()
.listener(new MyChunkListener()).reader(new MyItemReader())
.listener(new MyItemReaderListener()).writer(customItemWriter())
.listener(new MyWriteListener()).build();
}
最佳答案
您需要在 step1
中设置退出状态,以便决策者选择它并做出决定:
@Bean
public Step step1() {
return stepBuilderFactory.get("step1").tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("Exiting step1() execute()");
chunkContext.getStepContext().getStepExecution().setExitStatus(new ExitStatus("YES")); // or NO
return RepeatStatus.FINISHED;
}
}).build();
}
编辑:我认为决策者应该根据第 1 步的退出状态做出决定,因此是上一个示例。所以添加一个示例来展示如何使用决策器(在澄清之后):
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.job.flow.FlowExecutionStatus;
import org.springframework.batch.core.job.flow.JobExecutionDecider;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableBatchProcessing
public class MyJob {
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
@Bean
public Step step1() {
return steps.get("step1")
.tasklet((contribution, chunkContext) -> {
System.out.println("hello");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public JobExecutionDecider decider() {
return (jobExecution, stepExecution) -> new FlowExecutionStatus("YES"); // or NO
}
@Bean
public Step step2() {
return steps.get("step2")
.tasklet((contribution, chunkContext) -> {
System.out.println("world");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Step step3() {
return steps.get("step3")
.tasklet((contribution, chunkContext) -> {
System.out.println("!!");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Job job() {
return jobs.get("job")
.start(step1())
.next(decider())
.on("YES").to(step2())
.from(decider()).on("NO").to(step3())
.end()
.build();
}
public static void main(String[] args) throws Exception {
ApplicationContext context = new AnnotationConfigApplicationContext(MyJob.class);
JobLauncher jobLauncher = context.getBean(JobLauncher.class);
Job job = context.getBean(Job.class);
jobLauncher.run(job, new JobParameters());
}
}
在这个例子中,先执行step1,然后是decider。如果决策者返回YES
,则执行step2,如果返回NO
,则执行step3。
希望这对您有所帮助。
关于spring-batch - 如何在Spring批处理中使用decider?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52168976/
Akka 新手。创建一个扩展 SupervisorStrategy 的新 Scala 类为我提供了以下模板: class MySupervisorStrategy extends Supervisor
Selenium Webdriver如何确定按钮是启用还是禁用?我用过isEnabled() 两个按钮的方法-一个启用,另一个禁用,但在两种情况下均返回true。除了使用isEnabled()之外,还
我试图让闭包编译器内联一些以简单模式封装在配置对象中的代码,而无需任何类型注释。 React does this并设法降低 bundle 大小 我观察到以下情况: a.js (function mai
我一直在尝试针对 Android 进行改造。响应为空。如果我的理解是正确的,这可能是因为 400 响应或我的模型类中的响应建模不正确。我得到的响应如下: {"itemA":"data", "itemB
我正在尝试使用 Accord 库实现的 k 最近邻。首先,我使用了 double[][] inputs = new double[15000][]; int[] out
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
当我们使用 sadd 在集合中插入一个成员时,是否有一种确定的方式来插入数据?例如, 127.0.0.1:6380> smembers test 1) "hello world" 2) "hello"
我已经看过一些YOLO教程,但是我发现很难确定要分割图像的每个单元格的“ anchor ”框是否是预先确定的。在我经历的其中一个指南中,该图像被分为 13x13 单元格,并指出每个单元格预测 5 an
有没有办法在 Coq 中对相互递归类型使用决定相等策略? 例如,如果我有这样的东西: Inductive LTree : Set := | LNil | LNode (x: LTree) (y
我有几个类,例如 MyClassA MyClassB MyClassC 和 MyClassD 我想要一个给定 Class 类型的函数,该函数将创建(并执行任何操作......)一个作为该类实例的对象。
如何从以下 mysql 查询的 where 子句中引用 'decider'? SELECT *, CASE WHEN (cond1) THEN 1 W
我正在使用 C++ 中的 QuickFix 为代理 FIX 平台实现启动器端。他们的 FIX 规范提供了他们支持的消息列表;登录、心跳和其他消息。 MessageCracker(修复 4.2)为同一类
我正在尝试使用 Accord.NET 库进行对象分类,但我未能找到任何合适的示例,并且文档不足以理解该过程。我当前的代码是 Predictor = new Boost(); AdaBoost Algo
今天我在 msdn 中看到博客,我注意到如何计算算法的时间复杂度。我完全理解如何计算算法的时间复杂度,但最后作者提到了以下几行 Adding everything up I get (N+4)+(5N
随着我们的办公室升级到 Window 7,我的任务是更新登录脚本以与 Windows 7 一起使用。所述脚本的创建者早已不复存在,我不是批处理文件专家。 我要做的是确定操作系统。当我执行一些网络管理职
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
当我尝试在 Mac 上的 Andriod Studio 上运行该项目时,出现如下内部错误: Andriod Emulator closed because of an internal error:
我正在阅读一篇关于 Haskell 以及 HList 是如何实现的研究论文,并想知道所描述的技术何时可以确定,何时不能确定类型检查器。此外,因为您可以使用 GADT 做类似的事情,所以我想知道 GAD
我最近在一个用GCC 8编译的软件中研究了段错误。代码如下所示(这只是一个草图) struct Point { int64_t x, y; }; struct Edge { // some o
大多数句子分割器都能够在正确的位置分割文本流。 我正在寻找一个模型来决定某些文本是否是句子。 最佳答案 简单的解决方案:使用解析器(例如,Stanford Parser,它是免费的并且是Java的,但
我是一名优秀的程序员,十分优秀!