Spring Batch JmsItemReader работает некорректно - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть простая программа, работающая с Spring Batch JmsItemReader и пользовательским 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 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

Spitter (id = 0, userName = UserName0, пароль = pasword0, fullName = User User0, электронная почта = qwer @ qwer.com0)

Spitter (id = 0, userName = UserName572, пароль = pasword572, fullName = пользователь User572, email=qwer@qwer.com572)

Spitter (id = 0, userName = UserName773, пароль = pasword773, fullName = пользователь User773, email=qwer@qwer.com773)

SimpleJobLauncher: 136 - Задание: [FlowJob: [name = reportJob]] завершено со следующими параметрами: [{launchTime = 1545564286588}] и следующий статус: [ЗАВЕРШЕНО]

1 Ответ

0 голосов
/ 02 января 2019

Я не понимаю, почему и как количество прочитанных элементов может быть случайным. Хотя пара замечаний:

  • Вы устанавливаете sessionTransacted в шаблоне jms.Вы также установили readerIsTransactionalQueue на JmsItemReader?
  • Вы используете MapJobRepositoryFactoryBean, который по умолчанию использует ResourcelessTransactionManager.Это означает, что при выполнении (транзакционного) сеанса jms текущая транзакция не выполняется.Вы пытались установить sessionAcknowledgeMode = Session.SESSION_TRANSACTED в шаблоне jms?
  • Вы используете транзакционный сеанс jms, но я не вижу JmsTransactionManager, используемый на вашем шаге.Это предназначено?
  • В связи с предыдущими двумя моментами, использование транзакционного сеанса jms с нетранзакционным хранилищем заданий для меня не имеет смысла.Либо отключите sessionTransacted в шаблоне jms, либо используйте хранилище транзакционных заданий (в этом случае вам потребуется JtaTransactionManager для синхронизации двух менеджеров транзакций: jms и базы данных)

Если эти подсказки делаютне поможет, пожалуйста, поделитесь проектом со всем кодом и зависимостями на Github (или где-то еще), чтобы иметь возможность воспроизвести проблему и помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...