问题描述
有人遇到过类似的问题吗?
引起问题的连接来自通过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 (将#修改为@)