Я выполняю задания группового перехода 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.