rabbitmq - Spring RabbitMQ - 在 MessageListener 中获取 ClassCastException
问题描述
我在使用 Spring RabbitMQ 时从 AMQP 内部获取 ClassCastException。我们在生产的应用程序日志中发现了这一点,无法重现,但这对我们来说真的很痛苦。基本上,一旦发生这种情况,似乎整个堆栈都会失败,因为我们看到在该通道上发送了无效的 DeliveryTag,这导致 RabbitMQ 关闭该通道。
我们使用的是 AMQPClient 5.4.3 和 SpringRabbit 2.1.2,RabbitMQ 缓存模式是 Connection(因为 HAProxy 和故障转移),ACK 模式是手动的,发布者返回启用并且发布者确认也是如此。
java.lang.ClassCastException: com.rabbitmq.client.impl.AMQImpl$Channel$OpenOk cannot be cast to com.rabbitmq.client.impl.AMQImpl$Confirm$SelectOk
at com.rabbitmq.client.impl.ChannelN.confirmSelect(ChannelN.java:1552)
at com.rabbitmq.client.impl.ChannelN.confirmSelect(ChannelN.java:52)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.doCreateBareChannel(CachingConnectionFactory.java:658)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createBareChannel(CachingConnectionFactory.java:649)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.getCachedChannelProxy(CachingConnectionFactory.java:608)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.getChannel(CachingConnectionFactory.java:499)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.access$1600(CachingConnectionFactory.java:100)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$ChannelCachingConnectionProxy.createChannel(CachingConnectionFactory.java:1331)
at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1967)
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1935)
at org.springframework.amqp.rabbit.core.RabbitTemplate.send(RabbitTemplate.java:889)
at org.springframework.amqp.rabbit.core.RabbitTemplate.convertAndSend(RabbitTemplate.java:955)
at org.springframework.amqp.rabbit.core.RabbitTemplate.convertAndSend(RabbitTemplate.java:948)
at net.homecredit.lisa.messaging.amqp.SaveApplicationResponseProducer.sendResponse(SaveApplicationResponseProducer.kt:40)
at net.homecredit.lisa.messaging.amqp.SaveApplicationConsumer.onReceiveRequestMessage(SaveApplicationConsumer.kt:87)
at sun.reflect.GeneratedMethodAccessor372.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:170)
at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120)
at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:49)
at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:190)
at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:127)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1521)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1444)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1431)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1410)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:848)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:832)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$700(SimpleMessageListenerContainer.java:78)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1073)
at java.lang.Thread.run(Thread.java:748)
这对我来说完全是个谜。有谁知道出了什么问题?
解决方案
RabbitMQ 客户端可以配置为检查 RPC 的响应类型channelShouldCheckRpcResponseType
,另请参见https://github.com/rabbitmq/rabbitmq-java-client/issues/708。
推荐阅读
- javascript - 如何使用 Bootstrap 设置父 div 的表格高度
- tensorflow - 有没有办法在 TensorFlow 中选择学习率和预热学习率(没有 Keras 的 API)?
- javascript - 添加多个文件而不刷新当前文件的解决方法(HTML、JS)
- python - 如何在 check_in_date 和 check_out_date 之间划分收入,并将这些日期转换为名为 date 的单列
- mongodb - Mongo Project 变成一个聚合对象
- scala - Scala 通过嵌套的 Seq 集合进行过滤
- android - 如何获取“使用亚马逊登录”安全配置文件的 MD5 签名
- javascript - 使用 npm 安装包或创建 react 项目时出现错误。当我尝试安装任何软件包时显示错误
- amazon-web-services - 将 ECS 服务转换为 cloudformation
- r - 如何将字符串(“17NOV03”)转换为用于算术的日期