RabbitMQ正在关闭带有TLS服务器错误“未知消息”的现有AMQP连接

问题描述

有人遇到过类似的问题吗?

引起问题的连接来自通过Spring / RabbitMQ JMS连接到RabbitMQ服务器的客户端。 服务器仅以Occasionly(平均每天一次或两次)关闭连接,并显示以下错误消息:

[error] <0.31838.1785> closing AMQP connection <0.31838.1785> (<ip client>:47977 -> <ip server>:5671):
{inet_error,{tls_alert,{unexpected_message,"TLS server: In state connection received CLIENT ALERT: Fatal - Unexpected Message\n "}}}

然后在客户端上,我们会看到一个警告(如果没有正在进行的处理):

WARN  org.springframework.jms.listener.DefaultMessageListenerContainer
- [y_listenerContainerMedium-4] {}xxxx    Setup of JMS message listener invoker Failed for destination 'RMQDestination{destinationName='QUEUE_NAME',queue(permanent,amqp)',amqpExchangeName='null',amqpRoutingKey='null',amqpQueueName='QUEUE_NAME'}' - trying to recover. Cause: Connection has been shutdown: javax.net.ssl.SSLException: java.net.socketException: Unrecognized Windows Sockets error: 0: recv Failed

错误(当我们尝试在连接恢复之前发送消息)

com.rabbitmq.client.AlreadyClosedException: connection is already closed due to connection error; cause: java.net.socketException: Unrecognized Windows Sockets error: 0: recv Failed
    at com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:258) ~[amqp-client-5.9.0.jar:5.9.0]
    at com.rabbitmq.client.impl.AMQChannel.transmit(AMQChannel.java:427) ~[amqp-client-5.9.0.jar:5.9.0]
    at com.rabbitmq.client.impl.ChannelN.basicpublish(ChannelN.java:710) ~[amqp-client-5.9.0.jar:5.9.0]
    at com.rabbitmq.client.impl.ChannelN.basicpublish(ChannelN.java:685) ~[amqp-client-5.9.0.jar:5.9.0]
    at com.rabbitmq.client.impl.ChannelN.basicpublish(ChannelN.java:675) ~[amqp-client-5.9.0.jar:5.9.0]
    at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.basicpublish(AutorecoveringChannel.java:197) ~[amqp-client-5.9.0.jar:5.9.0]
    at com.rabbitmq.jms.client.RMQMessageProducer.sendamQPMessage(RMQMessageProducer.java:337) ~[rabbitmq-jms-2.1.1.jar:2.1.1]
    at com.rabbitmq.jms.client.RMQMessageProducer.internalSend(RMQMessageProducer.java:309) ~[rabbitmq-jms-2.1.1.jar:2.1.1]
    at com.rabbitmq.jms.client.RMQMessageProducer.access$200(RMQMessageProducer.java:32) ~[rabbitmq-jms-2.1.1.jar:2.1.1]
    at com.rabbitmq.jms.client.RMQMessageProducer$PreferMessageProducerPropertySendingStategy.send(RMQMessageProducer.java:495) ~[rabbitmq-jms-2.1.1.jar:2.1.1]
    at com.rabbitmq.jms.client.RMQMessageProducer.send(RMQMessageProducer.java:239) ~[rabbitmq-jms-2.1.1.jar:2.1.1]
    at org.springframework.jms.core.jmstemplate.doSend(jmstemplate.java:626) ~[spring-jms-4.3.20.RELEASE.jar:4.3.20.RELEASE]
    at org.springframework.jms.core.jmstemplate.doSend(jmstemplate.java:597) ~[spring-jms-4.3.20.RELEASE.jar:4.3.20.RELEASE]
    at org.springframework.jms.core.jmstemplate$3.doInJms(jmstemplate.java:562) ~[spring-jms-4.3.20.RELEASE.jar:4.3.20.RELEASE]
    at org.springframework.jms.core.jmstemplate.execute(jmstemplate.java:484) ~[spring-jms-4.3.20.RELEASE.jar:4.3.20.RELEASE]
    at org.springframework.jms.core.jmstemplate.send(jmstemplate.java:559) ~[spring-jms-4.3.20.RELEASE.jar:4.3.20.RELEASE]

客户端在Spring中配置:

<bean id="y_listenerContainerMedium" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="autoStartup" value="false"/>
    <property name="concurrentConsumers" value="1"/>
    <property name="connectionFactory" ref="jmsRmqConnectionFactory"/>
    <property name="destination" ref="y_queue_inbound_m"/>
    <property name="messageListener" ref="y_messageListener"/>
    <property name="sessionTransacted" value="true"/>       
</bean>

<bean id="y_queue_inbound_m" class="com.rabbitmq.jms.admin.RMQDestination" >
    <property name="destinationName" value="${y.jms.q.name.inbound.medium}" />
    <property name="amqp"            value="true" />
    <property name="amqpQueueName"   value="${y.jms.q.name.inbound.medium}" />
</bean>
  
<bean id="jmsRmqConnectionFactory" class="com.our.db.v2.jms.OurRMQConnectionFactory" >
    <property name="username" value="${sc.rmq.user}" />
    <property name="password" value="${sc.rmq.password}" />
    <property name="virtualHost" value="${sc.rmq.vhost}" />
    <property name="host" value="${sc.rmq.host}" />
    <property name="port" value="5671" /> 
    <property name="tls" value="true" /> 
    <!--  DeadLetter Handling on the Queue -->
    <property name="requeueOnMessageListenerException" value="true" /> 
    <!-- Allow Message Processing upto 12h -->
    <property name="onMessageTimeoutMs" value="43200000" /> 
  </bean>

  public class OurRMQConnectionFactory extends RMQConnectionFactory {
    public void setTls(boolean tls) throws Exception{
        if(tls) {
            super.useSslProtocol(SSLContext.getDefault());
        }
    }
  }
  

客户:
Microsoft Windows Server 2012 R2
jdk1.8.0_202
spring-jms-4.3.20.RELEASE
rabbitmq-jms-2.1.1
amqp-client-5.9.0

服务器:
红帽企业Linux 7.8
RabbitMQ 3.8.8
erlang-23.0.3-1.el7

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)