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

作业/步骤/读取器/写入器都应该是bean吗?

董哲
2023-03-14
@Bean
public Job footballJob() {
    return this.jobBuilderFactory.get("footballJob")
                     .listener(sampleListener())
                     ...
                     .build();
}

@Bean
public Step sampleStep(PlatformTransactionManager transactionManager) {
    return this.stepBuilderFactory.get("sampleStep")
                .transactionManager(transactionManager)
                .<String, String>chunk(10)
                .reader(itemReader())
                .writer(itemWriter())
                .build();
}

我有一个场景,服务器端将接收请求并并发运行作业(不同的作业名或相同的作业名具有不同的jobparameters)。它的用法是在并发线程中新建一个作业对象(包括steps/reader/writer),所以我不打算每次将作业方法声明为@bean并新建一个作业。

实际上,在如何将参数传输到像Reader这样的对象上存在差异。如果使用@bean,必须将参数放入例如JobParameters中,以便使用@stepscope将其后期绑定到object,如下所示:

@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value(
"#{jobParameters['input.file.name']}") String name) {
return new FlatFileItemReaderBuilder<Foo>()
.name("flatFileItemReader")
.resource(new FileSystemResource(name))
}

如果不使用@bean,我可以直接传输parameter,而不需要将数据放入JobParameter中,如下所示

public FlatFileItemReader flatFileItemReader(String name) {
return new FlatFileItemReaderBuilder<Foo>()
.name("flatFileItemReader")
.resource(new FileSystemResource(name))
}

如果不是强制的,当我新建一个像reader这样的对象时,我需要手动调用afterPropertiesSet()吗?

谢了!

共有1个答案

上官扬
2023-03-14

1.是否强制在作业/步骤/读取器/写入器中使用@bean?

不,将批量人工制品声明为bean并不是强制性的。但是您至少需要将作业声明为bean,以便从Spring的依赖项注入中受益(比如将作业存储库引用注入到作业中,等等),并且能够执行以下操作:

ApplicationContext context = new AnnotationConfigApplicationContext(MyJobConfig.class);
Job job = context.getBean(Job.class);
JobLauncher jobLauncher = context.getBean(JobLauncher.class);
jobLauncher.run(job, new JobParameters());

如果不是强制的,当我新建一个像reader这样的对象时,我需要手动调用afterPropertiesSet()吗?

import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TestAfterPropertiesSet {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }

    public static void main(String[] args) throws Exception {
        ApplicationContext context = new AnnotationConfigApplicationContext(TestAfterPropertiesSet.class);
        MyBean myBean = context.getBean(MyBean.class);
        myBean.sayHello();
    }

    static class MyBean implements InitializingBean {
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("MyBean.afterPropertiesSet");
        }

        public void sayHello() {
            System.out.println("Hello");
        }
    }

}
MyBean.afterPropertiesSet
Hello
 类似资料:
  • 问题内容: 回答 根据接受的答案代码,对该代码进行以下调整对我有用: 编辑 我已将问题更新为可以正确循环的版本,但是随着应用程序的扩展,能够并行处理非常重要,而且我仍然不知道如何在运行时使用javaconfig动态地执行此操作… 改进的问题: 如何在运行时 针对5种不同情况 动态创建读取器-处理器-写入器 (5个查询意味着按现在配置的5个循环)? 我的LoopDecider看起来像这样: 基于查询

  • 如何写这个问题?老实说,我不明白这个问题的意思。A) 编写读者和作者优先于读者的解决方案,并评论每个信号量的功能。(记住变量和信号量的定义和初始化)B)读卡器的优先级意味着什么?当一个作家在写作时,到达的读者会发生什么?当编写器结束其操作时会发生什么?

  • 根据已接受的答案代码,对该代码的以下调整对我起作用: 我已经将这个问题更新到了一个可以正确循环的版本,但是由于应用程序将扩展,能够处理并行是很重要的,我仍然不知道如何在运行时用javaconfig动态地做到这一点... 基于查询列表(HQL查询),我希望每个查询都有一个读取器-处理器-写入器。我当前的配置如下所示: 工单 处理机 作家 目前,该过程对于单个查询来说工作得很好。然而,我实际上有一个查

  • 我们的Spring批处理作业只有一个步骤,我们在步骤中有读取器,处理器,写入器操作。当上一步失败时,如何停止继续执行处理器步骤?

  • 我对Spring批处理框架相当陌生。 我在一个作业中创建了两个步骤(我们称之为步骤1和步骤2)。我想把它们并行运行。不仅如此,step2的IteamReader还应该使用step1的itemwriter。 我的第一个问题是,在Spring批量中是否有可能做到这一点?如果是,怎么做? 其次,如果这不可能,还有什么工作可以做呢? 谢了。

  • 问题内容: 我下面发布的示例代码显示了两个类。一个实现KeyListener,另一个实现Runnable,并在每20 ms休眠的无限循环中运行。当按下键时,采用int形式的keyChar用作索引,设置布尔数组的索引true或false,表示是否按下了该键。同时,过程循环正在键数组中搜索其true或false值,并将true设置为false,然后打印出char。我的问题是我是否需要使用带锁的同步来访