另外,在这个版本中,我试图使用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);
}
}
}
我会做以下几点:
jobservice
itemlist
和jobkey
成为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进