有多个工作,并选择我想在Spring中运行的工作

时间:2017-11-30 12:28:34

标签: java spring spring-batch

我需要实现两个不同的工作,并选择其中一个我想要运行,但我目前不能,它给了我以下错误:

JobInvokerController中的字段processJob需要一个bean,但是找到了2个: - procesaClientesJob:由类路径资源[batchConfig.class]中的'procesaClientesJob'方法定义      - procesaParcialClientesJob:由类路径资源中的'procesaParcialClientesJob'方法定义[BatchConfig.class]

动作:

考虑将其中一个bean标记为@Primary,更新使用者以接受多个bean,或使用@Qualifier标识应该使用的bean

我的BatchConfig.java就像:

[...]

@Bean
    Job procesaClientesJob(JobBuilderFactory jobBuilderFactory,
                           @Qualifier("flowCargaIdsClientes") Flow flowCargaIdsClientes,
                           @Qualifier("flowCargaDatosClientes") Flow flowCargaDatosClientes,
                           @Qualifier("flowCargaParcialIdsClientes") Flow flowCargaParcialIdsClientes,
                           @Qualifier("flowCargaParcialDatosClientes") Flow flowCargaParcialDatosClientes
                           ) {
        return jobBuilderFactory.get("procesaClientesJob")
                .incrementer(new RunIdIncrementer())
                .start(flowCargaIdsClientes).next(flowCargaDatosClientes).end()
                .build();
    }


    @Bean
    Job procesaParcialClientesJob(JobBuilderFactory jobBuilderFactory,
                           @Qualifier("flowCargaParcialIdsClientes") Flow flowCargaParcialIdsClientes,
                           @Qualifier("flowCargaParcialDatosClientes") Flow flowCargaParcialDatosClientes
                           ) {
        return jobBuilderFactory.get("procesaClientesJob")
                                .incrementer(new RunIdIncrementer())
                                .start(flowCargaParcialIdsClientes).next(flowCargaParcialDatosClientes).end()
                                .build();
    }

我的类JobInvokeController.java就像:

@RestController
public class JobInvokerController {
    private static final Logger log = Logger.getLogger(JobInvokerController.class);

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job processJob;

    @GetMapping("/invokejob/{strFecha}")
    public String invokejob(@PathVariable String strFecha) throws Exception {
        Date fecha;
        if (log.isDebugEnabled()) {
            log.debug("Procesamos el parámetro de entrada " + strFecha);
        }

        try {
            if (!StringUtils.isEmpty(strFecha)) {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
                fecha = sdf.parse(strFecha);
            } else {
                fecha = new Date();
            }
        } catch (Exception e) {
            fecha = new Date();
        }

        if (log.isDebugEnabled()) {
            log.debug("Invocamos al batch con la fecha: " + fecha);
        }

        JobParameters jobParameters = new JobParametersBuilder().addLong("time",System.currentTimeMillis()).addDate("fecha", fecha).toJobParameters();
        jobLauncher.run(processJob, jobParameters);

        return "Batch job has been invoked";
    }

}

我还有一个SpringBatchApplication.java:

@SpringBootApplication
public class SpringBatchApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBatchApplication.class, args);
    }
}

如何同时拥有两个作业并选择我想要的作业?

1 个答案:

答案 0 :(得分:1)

您希望何时选择要运行的作业? 如果是在应用程序启动之前,我建议使用配置文件,然后激活您要运行的作业的配置文件(-Dspring.profiles.active=job1) 或者,如果您想在运行期间选择,那么只需@Autowire您的两个工作就可以使用如下所述的限定符:Spring @Autowired and @Qualifier