Spring-boot получает сообщение об ошибке "second 'channel.open' visible" в связи с rabbitmq - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть приложение весенней загрузки, использующее версию весенней загрузки 1.5.16.RELEASE, которое добавляет в мое приложение следующие зависимости:

[INFO] |  +- com.rabbitmq:http-client:jar:1.0.0.RELEASE:compile
[INFO] |  +- org.springframework.amqp:spring-rabbit:jar:1.7.10.RELEASE:compile
[INFO] |  |  +- org.springframework.amqp:spring-amqp:jar:1.7.10.RELEASE:compile
[INFO] |  |  \- com.rabbitmq:amqp-client:jar:4.8.1:compile
[INFO] +- org.springframework.boot:spring-boot-starter-amqp:jar:1.5.16.RELEASE:compile

Приложение также использует сервер rabbitmq 3.6.6 в качестве сообщения-broker.

Я редко замечаю, что в моем приложении появляется следующая ошибка:

org.springframework.amqp.AmqpIOException: java.io.IOException
        at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:71)
        at org.springframework.amqp.rabbit.connection.SimpleConnection.createChannel(SimpleConnection.java:67)
        at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$ChannelCachingConnectionProxy.createBareChannel(CachingConnectionFactory.java:1208)
        at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$ChannelCachingConnectionProxy.access$200(CachingConnectionFactory.java:1197)
        at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.doCreateBareChannel(CachingConnectionFactory.java:562)
        at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createBareChannel(CachingConnectionFactory.java:545)
        at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.getCachedChannelProxy(CachingConnectionFactory.java:515)
        at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.getChannel(CachingConnectionFactory.java:497)
        at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.access$1300(CachingConnectionFactory.java:102)
        at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$ChannelCachingConnectionProxy.createChannel(CachingConnectionFactory.java:1213)
        at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1443)
        at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1419)
        at org.springframework.amqp.rabbit.core.RabbitTemplate.send(RabbitTemplate.java:713)
        at org.springframework.amqp.rabbit.core.RabbitTemplate.send(RabbitTemplate.java:707)
        ...
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:899)
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:790)
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:105)
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:208)
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1381)
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:760)
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1324)
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1294)
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1800(SimpleMessageListenerContainer.java:105)
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1550)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: null
        at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:124)
        at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:120)
        at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:142)
        at com.rabbitmq.client.impl.ChannelN.open(ChannelN.java:136)
        at com.rabbitmq.client.impl.ChannelManager.createChannel(ChannelManager.java:176)
        at com.rabbitmq.client.impl.AMQConnection.createChannel(AMQConnection.java:559)
        at org.springframework.amqp.rabbit.connection.SimpleConnection.createChannel(SimpleConnection.java:56)
        ... 43 common frames omitted
Caused by: com.rabbitmq.client.ShutdownSignalException: connection error; protocol method: #method<connection.close>(reply-code=504, reply-text=CHANNEL_ERROR - second 'channel.open' seen, class-id=20, method-id=10)
        at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66)
        at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36)
        at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:443)
        at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:263)
        at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:136)
        ... 47 common frames omitted

Приложение использует определенную очередь на rabbitmq, используя 50 одновременных потребителей.Кроме того, приложение работает на двух узлах (серверах) и использует одну и ту же очередь с 50 потребителями для каждого узла.

Вышеуказанная ошибка встречается редко.Чтобы объяснить, что я имею в виду, у меня есть около 30 экземпляров вышеуказанного приложения (то есть 60 серверов), каждый из которых получает трафик 100 запросов в секунду (события, полученные из rabbitmq), и большинство из них генерируют исходящие события в направлении rabbitmq, как в примерев стековой трассе выше.Частота появления ошибки составляет 3-4 раза в месяц (во всех случаях, а не в каждом из них).

Я искал в интернете эту ошибку, созданную специально из java amqp-client, нобез удачиЯ также попытался увеличить размер кэша канала (как предложено в документации ), чтобы все каналы кэшировались на стороне клиента, но после этого изменения проблема снова возникла.Может ли это быть вызвано тем, как я использую rabbitmq из моего приложения, или это ошибка, которая не обрабатывается внутри клиента rabbitmq?

...