ava RabbitMQ客户端(amqp-client-3.6.5.jar)无限期地阻塞了" Channel.Open"命令

时间:2016-08-11 06:05:24

标签: rabbitmq spring-integration spring-amqp spring-rabbitmq

我使用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服务器中安装的插件?

请在这方面帮助我。配置信息如下。

Spring Integration Amqp配置,用于发布消息并注册ack / nack,返回处理程序

<!-- 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();
        } 

    }

0 个答案:

没有答案