我的工作总是空的.无法使用Spring Batch注入批处理作业.为什么? [英] My job is always null. Can't inject a batch job with Spring Batch. Why?
问题描述
我正在使用Spring Batch来实现批处理作业,但是由于某些原因,当我尝试开始我的作业时,我的作业始终为空.在我看来,Spring框架在需要时不会注入我的工作. 有人可以告诉我我在做什么错吗?我对尝试和错误有点厌烦...
I am using Spring Batch to implement a batch job, but for some reasons my job is allways null, when I am trying to start my job. It seems to me that my job isn't injected when needed by the Spring framework. Can somebody tell me what I am doing wrong please?! I am a little bit tired of try and error...
这是我的spring配置(批处理配置):
This is my spring config (batch config):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:batch="http://www.springframework.org/schema/batch" xmlns:task="http://www.springframework.org/schema/task"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.2.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-2.2.xsd">
<bean id="batchTransactionManager"
class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
<bean id="recordItemReader" class="com.blang.court.exports.RecordItemReader" />
<batch:job id="recordReadJob" job-repository="jobRepository">
<batch:step id="recordReadStep">
<batch:tasklet ref="recordItemReader"
transaction-manager="batchTransactionManager" />
</batch:step>
</batch:job>
<bean id="batchLauncher" class="com.blang.court.exports.BatchLauncher">
<property name="jobLauncher" ref="jobLauncher" />
<property name="job" ref="recordReadJob" />
</bean>
这是另一个Spring配置(应用程序上下文):
And here comes another Spring config (application-context):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ws="http://jax-ws.dev.java.net/spring/core"
xmlns:wss="http://jax-ws.dev.java.net/spring/servlet" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://jax-ws.dev.java.net/spring/core
http://jax-ws.dev.java.net/spring/core.xsd
http://jax-ws.dev.java.net/spring/servlet
http://jax-ws.dev.java.net/spring/servlet.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd"
default-autowire="byName">
<context:annotation-config />
<tx:annotation-driven transaction-manager="applicationTransactionManager" />
<!-- Mail -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="localhost" />
</bean>
<!-- JPA -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="appPersistenceUnit" />
</bean>
<bean id="applicationTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- Spring Batch -->
<!-- <bean id="batchTransactionManager"
class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />-->
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
<property name="transactionManager" ref="applicationTransactionManager" />
</bean>
<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
这与配置有关.在下一步中,我实现了批处理启动器类.看起来像这样:
That's about the configuration. in the next step I implemented the batch launcher class. Which looks like that:
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.JobParametersInvalidException;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRestartException;
public class BatchLauncher
{
private Job job;
private JobLauncher jobLauncher;
public void launch()
{
JobParametersBuilder builder = new JobParametersBuilder();
try
{
JobExecution execution = jobLauncher.run(job, builder.toJobParameters());
}
catch (JobExecutionAlreadyRunningException | JobRestartException
| JobInstanceAlreadyCompleteException
| JobParametersInvalidException e)
{
e.printStackTrace();
}
}
public Job getJob()
{
return job;
}
public void setJob(Job job)
{
this.job = job;
}
public JobLauncher getJobLauncher()
{
return jobLauncher;
}
public void setJobLauncher(JobLauncher jobLauncher)
{
this.jobLauncher = jobLauncher;
}
}
最后是我的工作:
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import com.blang.court.RecordForm;
import com.blang.court.interfaces.IRecordService;
public class RecordItemReader implements Tasklet
{
@Autowired
IRecordService recordService;
@Override
public RepeatStatus execute(StepContribution arg0, ChunkContext arg1)
throws Exception
{
recordService.filterRecords(new RecordForm());
System.out.println("Hi, the job is running! Yeah, finally got it!");
return RepeatStatus.FINISHED;
}
}
我一直在Batchlauncher类的这一行上得到一个nullPointerException
:
I am allways getting a nullPointerException
on this line in the batchlauncher class:
JobExecution execution = jobLauncher.run(job, builder.toJobParameters());
告诉我我的jo为空.我已经对其进行调试以对其进行证明,...是的,由于某种原因,该工作为空....
Which tells me that my jo is null. I have debugged it to proof it and ... yes the job is null for some reason ....
请帮助我...:-(
亲切的问候
推荐答案
在您的配置中,属性job
引用一个Tasklet,而不是一个Job..
In your configuration the property job
refers a Tasklet and non a Job..
尝试此配置
<bean id="batchLauncher" class="com.blang.court.exports.BatchLauncher">
<property name="jobLauncher" ref="jobLauncher" />
<property name="job" ref="recordReadJob" />
</bean>
希望能对您有所帮助
当您通过新方法创建对象时,autowire \ inject不起作用...
When you create an object by new, autowire\inject don't work...
示例类
public class Test {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("app-context.xml");
BatchLauncher batchLauncher = (BatchLauncher ) context.getBean("batchLauncher");
batchLauncher.launch();
}
}
此 查看全文