У меня есть код интеграции Spring, который подключает слушателя JMS (который слушает локальную очередь серии mq)
<int-jms:message-driven-channel-adapter>
и пересылает сообщение rabbitmq (не контролируемому мной) через
<int-amqp:outbound-channel-adapter>
Я пытаюсь сохранить это транзакционное, что означает, что если rabbitmq не получил сообщение, я хочу сохранить его в локальной очереди серии MQ. Однако я заметил, что если обмен, упомянутый в конфигурациях rabbitmq, не существует, я вижу в своих журналах эту строку:
ERROR (CachingConnectionFactory.java:292) - Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'xxx' in vhost 'xxx', class-id=60, method-id=40)
Но мое сообщение исчезает для локальной очереди серии mq.
Что мне сделать, чтобы он повторил попытку отправки сообщения, если брокер rabbitmq не работает или обмен не существует?
Спасибо за помощь, Моя конфигурация:
<int-jms:message-driven-channel-adapter
id="x.y.z" channel="channel-in"
error-channel="errorChannel" header-mapper="jmsIntegrationHeaderMapper"
acknowledge="transacted" destination-name="a.b.c" />
<int:channel id="channel-in">
</int:channel>
<int:header-enricher input-channel="channel-in"
output-channel="channel-out">
<int:header name="url"
expression="'amqp://${amqp.user}@${amqp.host}:${amqp.port}/${amqp.vhost}'"></int:header>
</int:header-enricher>
<int:channel id="channel-out">
</int:channel>
<int-amqp:outbound-channel-adapter
channel="channel-out" amqp-template="amqpTemplate"
routing-key="crd" mapped-request-headers="*" exchange-name="${amqp.exchange}">
</int-amqp:outbound-channel-adapter>
<rabbit:connection-factory id="amqpConnectionFactory" addresses="${amqp.host}:${amqp.port}"
cache-mode="CONNECTION"
channel-cache-size="25"
username="${amqp.user}"
password="${amqp.pass}"
virtual-host="${amqp.vhost}"/>
<rabbit:template id="amqpTemplate"
connection-factory="amqpConnectionFactory" mandatory="true" channel-transacted="true"/>
acknowledge=transcted
, чтобы исключение откатило транзакцию; мы изменили значение по умолчанию на то, что было в 4.2. - person Gary Russell   schedule 07.08.2019<int-jms:message-driven-channel-adapter id="adapter.jms.xxxx" channel="channel.direct.incoming-xxxx" error-channel="errorChannel" header-mapper="jmsIntegrationHeaderMapper" acknowledge="transacted" destination-name="xxxx" />
Странно то, что нет исключения только строка ошибки, о которой я упоминал в сообщении. - person mortada   schedule 08.08.2019public void shutdownCompleted(ShutdownSignalException cause) { if (RabbitUtils.isPassiveDeclarationChannelClose(cause)) { if (logger.isDebugEnabled()) { logger.debug("Channel shutdown: " + cause.getMessage()); } } else if (!RabbitUtils.isNormalChannelClose(cause)) { logger.error("Channel shutdown: " + cause.getMessage()); } }
код только регистрирует ошибку, но не вызывает исключение, может быть, поэтому? - person mortada   schedule 08.08.2019