当前位置: 首页 > 知识库问答 >
问题:

使用AsyncRabbitTemplate时回复超时::SendandReceive-RabbitMQ

廖鸿达
2023-03-14

我最近在Spring Boot应用程序中从使用标准Rabbit模板改为使用异步Rabbit模板。在此过程中,我从标准的send方法切换到使用sendandreceive方法。

进行此更改似乎不会影响向RabbitMQ发布消息,但是现在在发送消息时,我确实看到了如下所示的堆栈跟踪:

org.springframework.amqp.core.AmqpReplyTimeoutException: Reply timed out
    at org.springframework.amqp.rabbit.AsyncRabbitTemplate$RabbitFuture$TimeoutTask.run(AsyncRabbitTemplate.java:762) [spring-rabbit-2.3.10.jar!/:2.3.10]
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) [spring-context-5.3.9.jar!/:5.3.9]
public static void main(String[] args) {
        com.rabbitmq.client.ConnectionFactory cf = new com.rabbitmq.client.ConnectionFactory();
        cf.setHost("localhost");
        cf.setPort(5672);
        cf.setUsername("<my-username>");
        cf.setPassword("<my-password>");
        cf.setVirtualHost("<my-vhost>");

        ConnectionFactory connectionFactory = new CachingConnectionFactory(cf);

        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setExchange("primary");
        rabbitTemplate.setUseDirectReplyToContainer(true);
        rabbitTemplate.setReceiveTimeout(10000);
        rabbitTemplate.setReplyTimeout(10000);
        rabbitTemplate.setUseChannelForCorrelation(true);

        AsyncRabbitTemplate asyncRabbitTemplate = new AsyncRabbitTemplate(rabbitTemplate);
        asyncRabbitTemplate.start();

        System.out.printf("Async Rabbit Template Running? %b\n", asyncRabbitTemplate.isRunning());

        MessageBuilderSupport<MessageProperties> props = MessagePropertiesBuilder.newInstance()
            .setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN)
            .setMessageId(UUID.randomUUID().toString())
            .setHeader(PUBLISH_TIME_HEADER, Instant.now(Clock.systemUTC()).toEpochMilli())
            .setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT);

        asyncRabbitTemplate.sendAndReceive(
            "1.1.1.csv-routing-key",
            new Message(
                "a,test,csv".getBytes(StandardCharsets.UTF_8),
                props.build()
            )
        ).addCallback(new ListenableFutureCallback<>() {
            @Override
            public void onFailure(Throwable ex) {
                System.out.printf("Error sending message:\n%s\n", ex.getLocalizedMessage());
            }

            @Override
            public void onSuccess(Message result) {
                System.out.println("Message successfully sent");
            }
        });
    }

我确信我只是缺少一个配置选项,但任何帮助都将是徒劳的。

谢谢。:)

共有1个答案

井疏珂
2023-03-14

设置回复超时到一些更大的数字,看看效果。

    rabbitTemplate.setReplyTimeout(60000);

https://docs.spring.io/spring-amqp/reference/html/#reply-timeout

 类似资料:
  • UnknownServerException:服务器在处理请求时遇到意外错误。 2020-07-06 09:46:23.521警告18218---[TaskScheduler-1]O.S.K.R.ReplyingKafkatemplate:回复超时:ProducerRecord(Topic=Student,Partition=NULL,headers=RecordHeaders(headers=[

  • 我尝试使用MockWebServer对我的应用编程接口的各种响应。我做了一个简单的例子,只是为了尝试我想做的是一种工作方法。 mockWebServer不是要“模拟”我的http连接的endpoint吗?像真正的服务器?每当我试图打电话时,我都会感到莫名其妙的惊讶。 我用错了吗?它不应该只是替换服务器的响应吗?(嘲笑) E D I T: 我在清单上有互联网许可。 我使用: 代码: Logcat:

  • 我有一个如下的集成,我从rest控制器调用这个方法,但回复超时并没有像我预期的那样工作。 我期望的是:如果在我给出的回复超时时间内没有响应,则返回timeout作为对客户端的响应。 对于通道配置中的超时持续时间,是否需要执行一些操作? 谢谢。

  • 我是SpringBoot的新手,正在寻找一种在endpoint超过3秒才能返回响应时超时的方法。我尝试添加属性“server.servlet.session.timeout”,但仍然没有运气。如何做到这一点?谢谢。 Application.properties

  • 我正在尝试使用mocha和mongoose编写一个测试用例。但我编写的以下代码片段在每个“hook:error:timeout of 2000ms extered.确保在此测试中调用了done()回调”之前都给出了错误“Todo”。我无法解决此问题。我是node的初学者。谁能在这个问题上帮我一下吗。提前谢谢。

  • 我有一个Java应用程序的问题。此应用程序使用Apache QPid broker(6.0.1)发送消息。 我在两台计算机上运行它:我用来工作的计算机,以及我们在将应用程序提供给客户端之前用于测试应用程序的计算机。 在我的电脑上,没有问题,应用程序发送或接收消息。 问题是我们换了另一台电脑。我安装qpid的方式与我的一样:我提取了。焦油gz,将$QPID\u WORK设置为工作目录,并设置我用于w