我有一个使用Spring和с自定义ItemWriter的简单程序。程序的目的是读取ActiveMQ队列。我已经将提交间隔设置为25,但它不起作用。我将以随机的间隔向我的项目撰稿人索取物品。我花了一整天的时间来解决这个问题,但我没能解决。请帮帮我。这是我的职务配置:
<batch:job id="reportJob">
<batch:step id="step1">
<batch:tasklet>
<batch:chunk reader="jmsItemReader"
writer="customItemWriter"
commit-interval="25">
</batch:chunk>
</batch:tasklet>
</batch:step>
</batch:job>
<bean id="jmsItemReader"
class="org.springframework.batch.item.jms.JmsItemReader">
<property name="itemType" value="com.example.Entities.Spitter"/>
<property name="jmsTemplate" ref="jmsTemplate"/>
</bean>
<bean id="customItemWriter" class="com.example.batch.CustomItemWriter"/>
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
</bean>
<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
<bean id="schedulingLauncher" class="com.example.batch.SchedulingLauncher">
<property name="job" ref="reportJob"/>
<property name="jobLauncher" ref="jobLauncher"/>
</bean>
<task:scheduler id="scheduler" />
<task:scheduled-tasks scheduler="scheduler">
<task:scheduled ref="schedulingLauncher"
method="launch"
fixed-delay="10000" />
</task:scheduled-tasks>JMS bean:
<bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616" />
<property name="userName" value="admin"/>
<property name="password" value="admin"/>
</bean>
<bean id="queue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="JpaQueue"/>
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="defaultDestination" ref="queue"/>
<property name="receiveTimeout" value="500"/>
<property name="sessionTransacted" value="true" />
</bean>我的ItemWriter:
public class CustomItemWriter implements ItemWriter<Object> {
public void write(List<?> items) throws Exception {
System.out.println("List size: " + items.size());
for (Object item: items) {
System.out.println(item);
}
}}
和ShedulingLauncher:
public class SchedulingLauncher {
private Job job;
private JobLauncher jobLauncher;
public void launch() throws Exception{
JobParameters jobParams =
new JobParametersBuilder().addLong("launchTime", System.currentTimeMillis()).toJobParameters();
jobLauncher.run(job,jobParams);
}输出:
SimpleJobLauncher:133 -作业:[FlowJob: name=reportJob]启动,参数如下:{launchTime=1545564286588} 执行步骤: step1 列表大小:3 喷壶(id=0,userName=UserName0,password=pasword0,fullName=User User0,email=qwer@qwer.com0) 喷壶(id=0,userName=UserName572,password=pasword572,fullName=User User572,email=qwer@qwer.com572) 喷壶(id=0,userName=UserName773,password=pasword773,fullName=User User773,email=qwer@qwer.com773) SimpleJobLauncher:136 -作业:[FlowJob: name=reportJob]已完成,参数如下:{launchTime=1545564286588}和以下状态:已完成
发布于 2019-01-02 15:24:33
我不明白为什么和为什么阅读项目的数量可以是随机的。不过,有几个注意事项:
sessionTransacted。你把readerIsTransactionalQueue也设置在JmsItemReader上了吗?MapJobRepositoryFactoryBean的ResourcelessTransactionManager。这意味着当您的(事务处理) jms会话正在运行时,没有正在进行的事务。您是否尝试过在jms模板上设置sessionAcknowledgeMode = Session.SESSION_TRANSACTED?JmsTransactionManager。这是故意的吗?sessionTransacted,要么使用事务性作业存储库(在这种情况下,需要一个JtaTransactionManager来同步两个事务管理器: jms和数据库)如果这些提示没有帮助,请共享一个项目与所有的代码和依赖的Github (或其他地方),以便能够重现问题,并帮助您。
https://stackoverflow.com/questions/53903333
复制相似问题