我正在尝试对作业使用Spring批处理。我有两个作业tempJob和tempJob2在两个单独的配置中。当尝试使用命令行参数(-dspring.batch.job.names=tempJob)运行tempJob时,SpringBatch尝试运行tempJob两次,我得到以下错误
2018-06-15 11:36:37.956信息14436---[main]O.S.B.C.L.Support.SimpleJobLauncher:Job:[SimpleJob:[name=TempJob]]已完成,参数如下:[{timestamp=06152018 11:36:30}],状态如下:[已完成]2018-06-15 11:36:38.049信息14436--[main]ConditionEvaluationReportLoggingListener:
@SpringBootApplication
@EnableBatchProcessing(modular=true)
public class SpringbatchdemoApplication {
public static void main(String[] args) {
String[] params = addTimestampAsParameter(args);
SpringApplication.run(SpringbatchdemoApplication.class, params);
}
@Bean
public ApplicationContextFactory runTempJob1() {
return new GenericApplicationContextFactory(TempConfig.class);
}
@Bean
public ApplicationContextFactory runTempJob2() {
return new GenericApplicationContextFactory(TempConfig2.class);
}
public static String[] addTimestampAsParameter(final String[] args){
String[] params = null;
if(null != args){
params = new String[args.length+1];
for(int i=0;i<args.length;i++){
params[i]=args[i];
}
}else{
params = new String[1];
}
SimpleDateFormat sdf = new SimpleDateFormat("MMddyyyy hh:mm:ss");
String timeStamp = sdf.format(new Date());
params[params.length-1] = String.format("TimeStamp=%s", timeStamp);
return params;
}
}
@Configuration
public class TempConfig {
@Autowired
JobBuilderFactory jobBuilder;
@Autowired
StepBuilderFactory stepBuilder;
@Bean
public Tasklet sampleTask(){
return new Tasklet() {
@Override
public RepeatStatus execute(StepContribution arg0, ChunkContext arg1) throws Exception {
System.out.println("Executed Temp Step of TempConfig Job -> TempJob");
return RepeatStatus.FINISHED;
}
};
}
@Bean
public Step tempStep(Tasklet sampleTask){
return stepBuilder.get("tempStep").tasklet(sampleTask).build();
}
@Bean
public Job tempJob(){
return jobBuilder.get("tempJob")
.start(tempStep(null))
.build();
}
}
@Configuration
public class TempConfig2 {
@Autowired
JobBuilderFactory jobBuilder;
@Autowired
StepBuilderFactory stepBuilder;
@Bean
public Step tempStep1(){
return stepBuilder.get("tempStep1").tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution arg0, ChunkContext arg1) throws Exception {
System.out.println("Executed Temp Step of TempConfig2 Job -> TempJob1");
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Job tempJob1(){
return jobBuilder.get("tempJob1")
.start(tempStep1())
.build();
}
}
当我进一步研究时发现,在提供-dSpring.batch.job.names时,SpringBatch使用JobLauncherCommandLinerUnner.LaunchJobFromProperties()方法执行作业。此方法尝试使用executeLocalJobs(jobParameters)和executeRegisteredJobs(jobParameters)执行作业;在调试时,我发现我的作业正在用这两种方法执行。
是否有任何解决方案使用命令行参数(modular=true)只运行一次作业。如果您需要更多的信息,请提供帮助和通知。
正如@Akhil-Khandelwal所说,从@enableBatchProcessing
注释中删除(Modular=true)
可以解决问题。它为我解决了。
问题是LocalIntegrationTestConfiguration被调用两次,一次由常规spring框架调用,然后由spock框架调用。我只想叫它一次。 我想在TESTSPEC中重用TEST上的配置,但不知道如何重用。有没有很好的专家?
非常简单的动画: 动画工作得很好。但是,完成块被调用了两次。这也很好,我知道我需要检查布尔值,看看它是否真的完成了。嗯,不仅完成块被调用了两次,而且两次都完成了。 我怎么知道动画是否真的完成了?
问题内容: 我是angular js的新手,目前仍然遇到非常有线的bug。控制器中的函数在按路由加载视图调用时会运行两次。 http://jsfiddle.net/4gwG3/5/ 您将看到两次警报! 我的观点很简单 我的应用程序代码如下 问题答案: 首先检查您是否没有两次初始化Angular应用程序(通过使用 ng-app 自动进行初始化)。 一次,我有2个带有ng-app的html页面(一个用
下面是我的用例的类似项目布局: 目标是在父级中配置gradle java插件的“配置Java”任务,以便所有子级都使用相同的配置。为了保持简单,我删除了特定于我的用例的配置。 文件内容如下所示。 渐变/设置。格雷德尔: gradle/父/构建。格雷德尔: 渐变/父/子/构建。格雷德尔: Gradle/父/子/src/main/java/Foo.java: 现在,如果我要调用: 是否输出我的日志消息
问题内容: 我有使用JQuery..I米一个问题在我的代码发送字段名和序列号,其通过获取其数据的ctrller 和并且与序列表中没有given..And生成预览显示面板更新字段名与插入的字段..现在,我再次尝试更改字段名称。tat是现在,当我单击生成的显示面板字段时,相应的设置将打开,我将尝试立即更改字段名称 两者和都相同..在我发送的是字段名和序列号 在功能2中,我要发送相同的字段名和(但其他值
问题内容: 如果我在节点中编写以下程序: 然后在服务器上单击两次,在服务器上看到两次- 我不确定为什么单个HTTP请求导致两次执行。 问题答案: 那是正常现象-您的浏览器拨打了多个电话。 例如,大多数浏览器都会呼叫来获取。 尝试记录网址: 然后您会看到正在调用的内容。