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

如何覆盖默认的JobLauncher?Spring批处理批注

朱高超
2023-03-14

有没有纯注解为Spring留档?我看到的90%的文档都是为xml实现编写的。

我正在尝试覆盖默认的JobLauncher以能够传递JobParameters,但我添加到下面代码中的任何JobLauncher函数都被忽略,而是运行默认的SimpleJobLauncher。

我想用4个不同的作业参数启动同一作业的4个并发实例。这些参数应该告诉读取器从哪个目录读取。

我可以使用@Value注释为目录传递值,但这似乎只允许我设置一个默认值,在运行之间不会更改。

创建作业时无法配置作业(“World”被完全忽略)

@EnableBatchProcessing
@Configuration
public class BatchConfiguration{
    private static final Logger log = LoggerFactory.getLogger(BatchConfiguration.class);

    @Resource
    public JobLauncher jobLauncher;

    @Resource
    public JobBuilderFactory jobBuilderFactory;

    @Resource
    public StepBuilderFactory stepBuilderFactory;

    @Bean
    @StepScope
    ItemReader<Record> reader(@Value("") String directory) {
        return new ExcelReader(directory);
    }

    @Bean
    public ItemProcessor processor() {
        return new ItemProcessor();
    }

    @Bean
    public JobCompletionNotificationListener listener(){
        return new JobCompletionNotificationListener();
    }

    @Bean
    public Writer writer() {
        Writer writer = new Writer();
        return writer;
    }

    //Job Definition
    @Bean
    public Job job(JobCompletionNotificationListener listener) {
        return jobBuilderFactory.get("job")
                .listener(listener)
                .flow(step1("World"))
                .end()
                .build();
    }

    @Bean
    public Step step1(String directory) {
        return stepBuilderFactory.get("step1")
                .<Record, Record> chunk(10)
                .reader(reader(directory))
                .processor(processor())
                .writer(writer())
                .build();
    }
}

我正在使用启动应用程序

    SpringApplication.run(Application.class, args);

是否有更好的方法启动应用程序??

共有2个答案

景恩
2023-03-14

如果希望持久化sb元数据(推荐),可以更新transactionManager bean。

@Bean
    public ResourcelessTransactionManager transactionManager() {
        return new ResourcelessTransactionManager();
    }

    @Bean
    public MapJobRepositoryFactoryBean mapJobRepositoryFactory(ResourcelessTransactionManager txManager)
            throws Exception {
        MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean(txManager);
        factory.afterPropertiesSet();
        return factory;
    }

    @Bean
    public JobRepository jobRepository(MapJobRepositoryFactoryBean factory) throws Exception {
        return factory.getObject();
    }

    @Bean
    public JobExplorer jobExplorer(MapJobRepositoryFactoryBean factory) {
        return new SimpleJobExplorer(factory.getJobInstanceDao(), factory.getJobExecutionDao(),
                factory.getStepExecutionDao(), factory.getExecutionContextDao());
    }

    @Bean
    public SimpleJobLauncher jobLauncher(JobRepository jobRepository) {
        SimpleJobLauncher launcher = new SimpleJobLauncher();
        launcher.setJobRepository(jobRepository);
        return launcher;
    }
盛承
2023-03-14

没有关于注释文档的消息,但我找到了传递参数的答案。因为我们不使用xml,所以可以使用AnnotationConfigApplicationContext,并指定最上面的包。然后,我们使用此上下文获取默认作业启动器,并在启动作业时传递参数

    ApplicationContext context = new AnnotationConfigApplicationContext("package.names.*");
    JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
    Job job = (Job) context.getBean("testJob");


    Map<String, JobParameter> params = new HashMap<String, JobParameter>();
    JobExecution execution = null;
    JobParameters jp = null;
    try {
        params.put("directory", new JobParameter("testfolder"));
        jp = new JobParameters(params);
        execution = jobLauncher.run(job, jp);

    } catch (Exception e) {
        e.printStackTrace();
    }
 类似资料:
  • 我在我的项目中集成了Spring Batch,我在运行JobLauncher时遇到了问题。 在我的类JobLauncher我有这个: 对于配置,我使用XML配置: 配置批处理。xml: 在作业配置中。我有: 当我在类JobLauncher中调试时,它会在jobLuancher中停止。运行,我也不例外,似乎SpringBatch无法识别reader和whriter!!有什么建议吗?

  • 我有以下一个批处理的Spring配置。我在生产批处理中遇到过一个问题,当一个特定的用例抛出一个不可跳过的异常时。当我在集成测试中复制用例时,批处理行为仍然很奇怪。当我的batch.commit-interval属性大于1时,将触发重试机制,回滚未提交的块,并再次处理所有以前的记录。当batch-commit-interval设置为1时,一旦抛出不可跳过的异常,批处理就会失败。 我尝试了batch-

  • 我无法覆盖REST API中默认的Spring Boot错误响应。我有以下代码 然后在我的REST api中抛出这个BusinessValidationException。这个处理程序被调用(我可以在调试器中看到它),但是我仍然得到缺省的Spring BootREST错误消息。是否有一种方法可以重写并仅将default用作后退?带有Groovy的Spring Boot版本1.3.2。最诚挚的问候

  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

  • 本文向大家介绍如何覆盖Spring Boot项目的默认属性?相关面试题,主要包含被问及如何覆盖Spring Boot项目的默认属性?时的应答技巧和注意事项,需要的朋友参考一下 这可以通过在application.properties文件中指定属性来完成。 例如,在Spring MVC应用程序中,您必须指定后缀和前缀。这可以通过在application.properties文件中输入下面提到的属性来

  • 我有一个RESTAPI,我不想强迫客户端发送请求参数。我有将近400个api方法,我不想将所有参数设置为“required=false” 我想覆盖Spring RequestParam的默认行为。我想将RequestParam接口的“required”属性的默认值设置为“false”。 有什么方法可以覆盖它吗?如果我不能或这不是最佳实践,有什么方法可以解决上述问题。