我试图将作业参数注入自定义ItemReader.我已经回顾了有关该主题的所有StackOverflow说明(例如:如何从Spring Batch中的ItemReader访问作业参数?),我发现这是一个常见的难点,大部分都没有解决.我希望春天的大师(@Michael Minella任何人)会看到这一点,并有一些见解.
即使没有代码或配置更改,我已经确定了大约十分之一的运行参数可用.这是随机成功而非随机失败的情况,因此很难追查.
我使用调试器挖掘了spring代码,并确定当失败时,在注入发生时没有在Spring中注册名为jobParameters的bean.
我使用Spring 4.1.4和spring-batch 3.0.2以及spring-data-jpa 1.7.1和spring-data-commons 1.9.1,在java 8中运行.
Java类
@Component("sourceSelectionReader")
@Scope("step")
public class SourceSelectionReaderImpl
implements ItemReader<MyThing> {
private Map<String,Object> jobParameters;
// ... snip ...
@Autowired
@Lazy
@Qualifier(value="#{jobParameters}")
public void setJobParameters(Map<String, Object> jobParameters) {
this.jobParameters = jobParameters;
}
}
Run Code Online (Sandbox Code Playgroud)
工作启动参数:
launch-context.xml job1 jobid(long)=1
Run Code Online (Sandbox Code Playgroud)
launch-context.xml(减去绒毛):
<context:property-placeholder location="classpath:batch.properties" />
<context:component-scan base-package="com.maxis.maximo.ilm" />
<jdbc:initialize-database data-source="myDataSource" enabled="false">
<jdbc:script location="${batch.schema.script}" />
</jdbc:initialize-database>
<batch:job-repository id="jobRepository"
data-source="myDataSource"
transaction-manager="transactionManager"
isolation-level-for-create="DEFAULT"
max-varchar-length="1000"/>
<import resource="classpath:/META-INF/spring/module-context.xml" />
Run Code Online (Sandbox Code Playgroud)
Module-context.xml(减去绒毛):
<description>Example job to get you started. It …Run Code Online (Sandbox Code Playgroud) 我缺少什么?
AMQ 版本 5.13.2 Java 1.8.0_74 Windows 10
给定一个简单的测试用例,传输两个对象消息,一个包含数据,另一个是数据结束标记。仅接收数据结束标记。
队列在作业开始时创建,并在作业完成后销毁。
如果我运行大量交易,我会看到大约 50% 的接收率。
日志清楚地显示接收器在第一条消息放入队列之前启动,两条消息都被放入队列,但实际上只接收第二条消息。
发送方和接收方都位于同一个 JVM 上。每个都有自己的会话和连接。
连接和队列设置代码:
@Override
public void beforeJob(JobExecution jobExecution) {
// TODO Auto-generated method stub
try {
jobParameters = jobExecution.getJobParameters();
readerConnection = connectionFactory.createConnection();
readerConnection.start();
writerConnection = connectionFactory.createConnection();
writerConnection.start();
jmsQueueManagementSession = writerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
queueName = jobParameters.getString("jobName") + "." + jobExecution.getId();
queue = jmsQueueManagementSession.createQueue(getQueueName());
} catch (JMSException ex) {
throw new MaxisRuntimeException(
MaxisCodeHelperImpl.generateCode("MXAR", MXMODULE, JMS_RECEIVER_INITIALIZATION_ERROR), null);
}
}
Run Code Online (Sandbox Code Playgroud)
发送者设置代码:
@Override
public void beforeStep(StepExecution stepExecution) {
this.stepExecution = stepExecution; …Run Code Online (Sandbox Code Playgroud)