当前位置: 首页 > 知识库问答 >
问题:

使用modular=true配置时在SpringBatch中调用了两次作业

郦兴德
2023-03-14

我正在尝试对作业使用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)只运行一次作业。如果您需要更多的信息,请提供帮助和通知。

共有1个答案

程沛
2023-03-14

正如@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请求导致两次执行。 问题答案: 那是正常现象-您的浏览器拨打了多个电话。 例如,大多数浏览器都会呼叫来获取。 尝试记录网址: 然后您会看到正在调用的内容。