我使用Spring Integration AMQP 4.1.2,Spring Rabbit 1.4.3,Spring Amqp 1.4.3,amqp-client-3.6.5.jar将消息发布到RabbitMQ服务器3.5.3 作为否定测试的一部分,我正在向非现有Exchange发送消息。 我有一个使用Spring Integration Amqp配置的否定确认处理程序。使用失败的消息调用此否定确认处理程序,甚至此消息包含否定确认的原因。 到目前为止一切都很完美。
作为要求的一部分,我需要再次重试失败的消息。因此,否定确认处理程序退出以再次发布相同的消息。
这时,当Java RabbitMQ客户端(amqp-client-3.6.5.jar)试图发出命令" Channel.Open"到RabbitMQ服务器。
但是这个调用被无限期地阻塞(AMQP Connection线程无限期地等待负责通知的Object BlockingValueOrException)
并且Java客户端无限期地等待对命令" Channel.Open"的响应。但我可以看到使用管理控制台在RabbitMQ服务器中创建了一个新频道。
为什么我的"频道。打开"电话被阻止? RabbitMQ服务器无法向命令发送响应" Channel.Open"? 如何检查Java RabbitMQ客户端和RabbitMQ服务器之间传递的命令请求和响应?我们是否有需要在RabbitMQ服务器中安装的插件?
请在这方面帮助我。配置信息如下。
<!-- AMQP/RMQ Publishing -->
<int-amqp:outbound-channel-adapter
default-delivery-mode="PERSISTENT" exchange-name="${prism.rabbitmq.exchange}"
routing-key-expression="headers['${prism.rabbitmq.message.header.routingKey}']" amqp-template="amqpTemplate"
mapped-request-headers="*" channel="outgoingRabbit"
confirm-ack-channel="successfullyPublishedChannel"
confirm-nack-channel="mailPublishingExceptionChannel"
confirm-correlation-expression="#this" lazy-connect="false" return-channel="mailPublishingExceptionChannel"/>
<!-- AMQP client connection factory -->
<bean id="amqpClientConnectionFactory" class="com.rabbitmq.client.ConnectionFactory">
<property name="uri"
value="amqp://guest:guest@127.0.0.1:5672" />
<property name="automaticRecoveryEnabled"
value="true" />
</bean>
<rabbit:connection-factory id="amqpConnectionFactory"
host="127.0.0.1" connection-factory="amqpClientConnectionFactory"
publisher-confirms="true" publisher-returns="true" channel-cache-size="5"/>
<rabbit:template id="amqpTemplate" connection-factory="amqpConnectionFactory"
exchange="${prism.rabbitmq.exchange}" retry-template="retryTemplate" mandatory="true"/>
<bean id="retryTemplate" class="org.springframework.retry.support.RetryTemplate">
<property name="retryPolicy">
<bean class="org.springframework.retry.policy.SimpleRetryPolicy">
<property name="maxAttempts" value="4" />
</bean>
</property>
<property name="backOffPolicy">
<bean class="org.springframework.retry.backoff.ExponentialBackOffPolicy">
<property name="initialInterval" value="1000" />
<property name="multiplier" value="5.0" />
<property name="maxInterval" value="60000" />
</bean>
</property>
</bean>
<int:service-activator input-channel="mailPublishingExceptionChannel" ref="mailPublishingExceptionHandler" method="handleError" />
@Autowired
@Qualifier("outgoingRabbit")
private MessageChannel outgoingRabbit;
@Override
public void handleError(Message<?> genMessage) {
try {
// Retry !!
// Get the failed RMQ Message whose payload is JSON and has Message
// Headers as well.
Message failedRMQMessage = (Message) genMessage.getPayload();
MessageBuilder rmqMessageWithRetry = MessageBuilder.withPayload(failedRMQMessage.getPayload());
rmqMessageWithRetry.copyHeaders(failedRMQMessage.getHeaders());
new MessagingTemplate().send(outgoingRabbit, rmqMessageWithRetry.build()); --> this call again publishes the payload
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}