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

将bean注入spring-batch项目读取器

钮巴英
2023-03-14

另外,在这个版本中,我试图使用XML配置将JobService bean注入到ItemReader中。

这里的一般问题是:如何将其他DAO和/或服务注入项目读取器和写入器?

<beans:bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
    <beans:property name="dataSource" ref="dataSourceJNDI" />
    <beans:property name="transactionManager" ref="transactionManager" />
    <beans:property name="databaseType" value="mysql" />
</beans:bean>

<beans:bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <beans:property name="jobRepository" ref="jobRepository" />
</beans:bean>

<beans:bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry" />

<beans:bean id="myItemReader" class="my.MyItemReader" scope="step">
    <beans:property name="jobService">
        <beans:bean class="my.JobService"></beans:bean>
    </beans:property>
</beans:bean>

<job id="assignLeadBatch" restartable="false" job-repository="jobRepository">
    <step id="step1">
        <tasklet transaction-manager="dbOpsTransactionManager">
            <chunk reader="myItemReader" writer="myItemWriter" commit-interval="10" />
        </tasklet>
    </step>
</job>

<beans:bean class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
    <beans:property name="jobRegistry" ref="jobRegistry" />
</beans:bean>
@Scope(value = "step", proxyMode = ScopedProxyMode.INTERFACES)
@Component
public class MyItemReader implements ItemReader<Integer> {

    JobService jobService;

    private List<Integer> itemsList;

    @Autowired
    public AssignLeadsJobItemReader(@Value("#{jobParameters['jobKey']}") final String jobKey) {

        MyJob alj = jobService.loadByKey(jobKey);

        itemsList = new ArrayList<AssignLeadsJobItem>();

        for(Integer i : myJob.getIdList()) {            
            itemsList.add(i);
        }
    }

    @Override
    public Integer read(){
        if(itemsList == null || itemsList.size() == 0) {
            return null;
        } else {
            return itemsList.remove(0);
        }
    }

    public JobService getJobService() {
        return jobService;
    }

    public void setJobService(JobService jobService) {
        this.jobService = jobService;
    }
}
@Service
@Transactional
public class JobService {
    @Autowired
    protected JobDAO jobDao;

    @Autowired
    protected SpringBatchService springBatchService;

    public JobExecution startJob(String jobName, String jobKey) {    
            // Defined in a different Class without transactions.
            return springBatchService.startJob("job_name", jobKey);
    }

    public MyJob loadByKey(String jobKey) {
            return jobDao.loadByKey(jobKey);
    }
}
@Scope(value = "step", proxyMode = ScopedProxyMode.INTERFACES)
@Component
public class MyItemReader implements ItemReader<Integer> {
    private JobService jobService;
    private List<Integer> itemsList;
    private String jobKey;

    @Autowired
    public MyItemReader(@Value("#{jobParameters['jobKey']}") final String jobKey) {
        this.jobKey = jobKey;
        this.itemsList = null;
    }

    @Override
    public Integer read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
        // ugly ugly ugly
        if (itemsList == null) {
            itemsList = new ArrayList<Integer>();

            MyJob jobData = jobService.loadByKey(jobKey);

            for (Integer i : jobData.getIdList()) {
                itemsList.add(i);
            }
        }

        if (itemsList.isEmpty()) {
            return null;
        } else {
            return itemsList.remove(0);
        }
    }
}

共有1个答案

阎德业
2023-03-14

我会做以下几点:

  • autowirejobservice
  • 使itemlistjobkey成为final变量
  • 使用InitializingBean接口填充列表

现在您的读者将如下所示:

@Scope(value = "step", proxyMode = ScopedProxyMode.INTERFACES)
@Component
public class MyItemReader implements ItemReader<Integer>, InitializingBean {

    private final List<Integer> itemsList = new ArrayList<AssignLeadsJobItem>();

    @Autowired
    private JobService jobService;

    private final String jobKey;

    @Autowired
    public MyItemReader(@Value("#{jobParameters['jobKey']}") final String jobKey) {
        this.jobKey = jobKey;
    }

    @Override
    public Integer read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
        if(itemsList.size() == 0) {
            return null;
        } else {
            return itemsList.remove(0);
        }
    }

    @Override
    public void afterPropertiesSet() {
        MyJob myJob = jobService.loadByKey(jobKey);
        for(Integer id : myJob.getIdList()) {            
            itemsList.add(id);
        }
    }
}
 类似资料:
  • 我正在尝试制作一个Spring批处理作业, Reader从数据库读取一个项目 Processor创建项目列表 UnpackingItmeWriter接受项目列表,并将单个项目发送给FlatFileItemWriter<下面是我的代码。我从这个答案中得到了这个答案。我在这个配置中没有做正确的事情,因为当我运行它时,作业甚至没有启动。请给我指出正确的方向。 编辑:printStack

  • 试图实现Spring批处理,但面临一个奇怪的问题,我们的类只执行了一次。 以下是细节。 如果我们在DB中有1000行。 我们的项目阅读器从DB中获取1000行,并将列表传递给 成功删除所有项目。 现在ItemReader再次尝试从数据库中获取数据,但没有找到,因此返回NULL,因此执行停止。 但是我们已经将批处理配置为使用调度器执行,这是每分钟执行一次。 现在,如果我们通过转储导入在DB中插入让我

  • 问题内容: 是否可以将Spring bean注入RestEasy @Path类中?我设法通过Jersey并使用@InjectParam注释完成了此操作,但是由于某些其他原因,我需要切换到RestEasy,而且我似乎找不到解决方法(尝试了javax.inject.Inject,但没有)。 编辑 此解决方案有效:http : //www.mkyong.com/webservices/jax-rs/re

  • 我正在使用spring batch来解析我的文件。我想使用spring批管理的工作检查,工作启动,工作执行。Spring Batch Admin使用在启动时初始化的HSQLDB数据库。我的spring batch项目使用它自己的数据库,其中包括用于spring batch的适当表: batch_job_instance batch_job_params batch_job_execution ba

  • 我有一个Spring批处理项目,它使用基于注释的配置,并且是一个工作代码本身。现在我想将它与一个新的Spring Batch管理项目集成。我尝试了一些博客中可用/回答的解决方案,比如将批处理项目的依赖项添加到批处理管理项目中,并修改META-INF/spring/batch/servlet/override/context-config.xml文件以指向批处理项目配置文件。即。job包存在于Spr

  • 我正在开发一个遗留的JSF应用程序,我们正在慢慢地将其移植到Spring MVC。我们正在使用Spring Security来控制登录信息。在用户登录之后,JSF页面全局地实例化一个在任何地方都使用的会话作用域bean。我想更改应用程序,这样我们就可以先进入用Spring MVC开发的页面。 我尝试的一种方法是将bean转换为spring bean,并将其注入JSF,但不幸的是,这需要对bean进