gpt4 book ai didi

rabbitmq 客户端在尝试声明队列时挂起

转载 作者:行者123 更新时间:2023-12-04 13:03:22 24 4
gpt4 key购买 nike

我尝试寻找我的问题的解决方案,但找不到堆栈溢出。

问题
当用户尝试声明队列或交换时,在 RabbitMQ 服务器出现问题的极端情况下,客户端会一直等待而没有任何超时,这会导致调用 rabbitmq 的线程始终处于等待状态(等待永远不会结束)。

下面是堆栈跟踪

java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at com.rabbitmq.utility.BlockingCell.get(BlockingCell.java:50)
- locked <0x00000007bb0464c8> (a com.rabbitmq.utility.BlockingValueOrException)
at com.rabbitmq.utility.BlockingCell.uninterruptibleGet(BlockingCell.java:89)
- locked <0x00000007bb0464c8> (a com.rabbitmq.utility.BlockingValueOrException)
at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:33)
at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:343)
at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:216)
at
(AMQChannel.java:118)
at com.rabbitmq.client.impl.ChannelN.queueDeclare(ChannelN.java:833)
at com.rabbitmq.client.impl.ChannelN.queueDeclare(ChannelN.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:917)
- locked <0x00000007bb555300> (a java.lang.Object)
at com.sun.proxy.$Proxy293.queueDeclare(Unknown Source)
at org.springframework.amqp.rabbit.core.RabbitAdmin.declareQueues(RabbitAdmin.java:575)
at org.springframework.amqp.rabbit.core.RabbitAdmin.access$200(RabbitAdmin.java:66)
at org.springframework.amqp.rabbit.core.RabbitAdmin$12.doInRabbit(RabbitAdmin.java:504)
at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1456)
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1412)
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1388)
at org.springframework.amqp.rabbit.core.RabbitAdmin.initialize(RabbitAdmin.java:500)
at org.springframework.amqp.rabbit.core.RabbitAdmin$11.onCreate(RabbitAdmin.java:419)
at org.springframework.amqp.rabbit.connection.CompositeConnectionListener.onCreate(CompositeConnectionListener.java:33)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:553)
- locked <0x00000007bb057828> (a java.lang.Object)
at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1431)
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1412)
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1388)
at org.springframework.amqp.rabbit.core.RabbitAdmin.declareQueue(RabbitAdmin.java:207)

任何帮助将不胜感激。队列声明目前在我的 bean 后构造中调用我们的组件处理消息,因此不会创建任何新 bean。

更新
问题再次出现在我们的生产服务器上。当尝试通过 amqp-client-3.4.2 直接连接时,它似乎有效。但是从 spring-rabbit-1.6.7.RELEASE, spring-amqp-1.6.7.RELEASE 它不起作用。

通过 amqp-client-3.4.2
        ConnectionFactory factory = new ConnectionFactory();
factory.setHost("<<HOST NAME>>");
factory.setUsername("<<USERNAME>>");
factory.setPassword("<<PASSWORD>>");
factory.setVirtualHost("<<VIRTUAL HOST>>");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, true, false, false, null);

Code flow with rabbit-amqp client

不工作的 Spring 方式
        CachingConnectionFactory factory = new CachingConnectionFactory();
factory.setHost("<<HOST NAME>>");
factory.setUsername("<<USERNAME>>");
factory.setPassword("<<PASSWORD>>");
factory.setVirtualHost("<<VIRTUAL HOST>>");

RabbitAdmin admin = new RabbitAdmin(factory);
Queue queue = new Queue(QUEUE_NAME);
admin.declareQueue(queue);

Code flow with spring amqp

此问题很少发生,我们仍在尝试找出此行为背后的原因。我们尝试设置连接超时,但在我们的测试程序中不起作用。

在进一步调试它时,看起来异常不允许将通知发送回我们的代码。对于客户未发现的问题,我们正确地得到异常。

我们在 CentOS Linux 7 (Core) 上使用 RabbitMQ 3.6.10 和 Erlang 19.3.4

最佳答案

Declaration of queues is currently in my postconstruct of beans



我不能说挂起,但你永远不应该从 post 构造中与代理交互, afterPropertiesSet()等等。在应用程序上下文生命周期中为时过早。

有几种解决方法 - 实现 SmartLifecycle ;返回 true来自 isAutoStartup()并将 bean 置于早期阶段(参见 Phased)。 start()将在应用程序上下文完全创建后调用。

但是,通常最好将队列、绑定(bind)等定义为 bean,让框架为您完成所有声明。

关于rabbitmq 客户端在尝试声明队列时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48275505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com