Перенос групповых заданий весенних разделов из Spring Batch 2.2 в Spring Batch 4.02 - PullRequest
0 голосов
/ 15 января 2019

Я выполняю задания группового перехода Spring Spring (конфигурация XML) из Spring Batch 2.2.7 / Spring 3.2 в Spring Batch 4.0.2 / Spring 5.0.12. Файл войны развернут на Wildfly 11 с ActiveMQ Artemis. Общий подход использует x кластерных серверов приложений и делит разделенные задания на y разделов, при этом каждый сервер имеет прослушиватели y / x, поэтому нагрузка равномерно распределяется по кластеру.

Мы используем 1 очередь для исходящих сообщений и 1 очередь для входящих сообщений во всех многораздельных пакетных заданиях. Все вакансии совместно используют один JmsInboundGateway, например:

<int-jms:inbound-gateway 
        id="springbatch.master.inbound.gateway" 
        connection-factory="springbatch.listener.jmsConnectionFactory" 
        request-channel="springbatch.slave.jms.request" 
        request-destination="springbatch.partition.jms.requestsQueue" 
        concurrent-consumers="${springbatch.partition.concurrent.consumers}" 
        max-concurrent-consumers="${springbatch.partition.concurrent.maxconsumers}" 
        max-messages-per-task="${springbatch.partition.concurrent.maxmessagespertask}"/>

    <int:service-activator 
        input-channel="springbatch.slave.jms.request" 
        output-channel="springbatch.slave.jms.response" 
        ref="springbatch.stepExecutionRequestHandler"/>   

Каждое задание имеет выходной шлюз, определенный как:

<int-jms:outbound-gateway 
    connection-factory="springbatch.jmsConnectionFactory" 
    request-channel="partitioned.jms.requests" 
    request-destination="partition.jms.requestsQueue" 
    reply-channel="partitioned.jms.reply" 
    reply-destination="partition.jms.repliesQueue"
    receive-timeout="partitioned.timeout}"
    correlation-key="JMSCorrelationID" >
    <int-jms:reply-listener cache-level="0" />        
</int-jms:outbound-gateway>

<int:aggregator 
    input-channel="partitioned.jms.reply" 
    ref="partitioned.jms.handler"/>

На основании изменений схемы интеграции мы удалили JMSCorrelationId и прослушиватель ответов из входящего шлюза.

Для первоначальной интеграции я определяю только входящий шлюз, а Wildfly выдает следующее исключение:

[org.springframework.jms.listener.DefaultMessageListenerContainer] (springbatch.master.inbound.gateway.container-2) Setup of JMS message listener invoker failed for destination 'ActiveMQQueue[partitionRequestQueue]' - trying to recover. Cause: Only allowed one session per connection. See the J2EE spec, e.g. J2EE1.4 Section 6.6: javax.jms.IllegalStateException: Only allowed one session per connection. See the J2EE spec, e.g. J2EE1.4 Section 6.6     
    at org.apache.activemq.artemis.ra.ActiveMQRASessionFactoryImpl.allocateConnection(ActiveMQRASessionFactoryImpl.java:817)    
    at org.apache.activemq.artemis.ra.ActiveMQRASessionFactoryImpl.createSession(ActiveMQRASessionFactoryImpl.java:531)     
    at org.springframework.jms.support.JmsAccessor.createSession(JmsAccessor.java:208)  
    at org.springframework.jms.listener.DefaultMessageListenerContainer.access$1500(DefaultMessageListenerContainer.java:125)

Существует ли другой подход к определению количества слушателей из-за этой ошибки

Only allowed one session per connection. See the J2EE spec, e.g. J2EE1.4 Section 6.6

ОБНОВЛЕНИЕ к вопросам ниже

Когда Wildfly запускается, я вижу эту строку

WFLYJCA0002: Bound JCA ConnectionFactory [java:/JmsXA]

Я использую Java: / JmsXA

Это приложение Spring Boot, и оно работает без ошибок в журналах для 5 определенных JmsListeners.

2019-01-16 06:30:54,667 DEBUG DefaultMessageListenerContainer] (ServerService Thread Pool -- 67) Resumed paused task: org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker@a877e28

Когда я добавляю определение Jms-inbound-gateway, я начинаю видеть ошибки, перечисленные выше.

Схема Вопрос

XML, определяющий входящий шлюз, имеет следующее определение схемы

http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd

Предыдущий код (пакет 2.2) имел следующее определение схемы:

http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-2.2.xsd
http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms-2.2.xsd

Я только что обновил с

http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-5.0.xsd
http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms-5.0.xsd

и я могу добавить JMSCoordinationID обратно, чтобы проблема была решена.

Тем не менее, я все еще имею ошибку с ActiveMQ при запуске сервера, когда я включаю jms-inbound-gateway.

1 Ответ

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

Чтобы решить проблему с J2ee Spec, мне нужно было добавить кеш-уровень = 0 для входящего шлюза.

<int-jms:inbound-gateway 
    id="springbatch.master.inbound.gateway" 
    connection-factory="springbatch.jmsConnectionFactory" 
    request-channel="springbatch.slave.jms.request" 
    request-destination="springbatch.partition.jms.requestsQueue" 
    reply-channel="springbatch.slave.jms.response" 
    concurrent-consumers="${springbatch.partition.concurrent.consumers}" 
    max-concurrent-consumers="${springbatch.partition.concurrent.maxconsumers}" 
    max-messages-per-task="${springbatch.partition.concurrent.maxmessagespertask}"
    reply-time-to-live="${springbatch.partition.reply.time.to.live}"  
    cache-level="0"
/>
...