首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >超时后收到的答复

超时后收到的答复
EN

Stack Overflow用户
提问于 2019-01-14 22:49:47
回答 2查看 3.5K关注 0票数 4

我想用最新的Spring版本为Spring注册两个队列侦听器:

代码语言:javascript
复制
    @Bean
    public SimpleMessageListenerContainer processingTransactionSaleContainer(ConnectionFactory cf, TransactionElavonSaleListener listener) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cf);
        container.setQueueNames(QUEUE_PROCESSING_SALE);
        container.setMessageListener(new MessageListenerAdapter(listener, "transactionSaleProcess"));
        container.setMessageConverter(new SerializerMessageConverter());
        return container;
    }

    @Bean
    public SimpleMessageListenerContainer processingTransactionAuthorizeContainer(ConnectionFactory cf, TransactionAuthorizeListener listener) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cf);
        container.setQueueNames(QUEUE_PROCESSING_AUTHORIZE);
        container.setMessageListener(new MessageListenerAdapter(listener, "transactionAuthorizeProcess"));
        container.setMessageConverter(new SerializerMessageConverter());
        return container;
    }

听众:

代码语言:javascript
复制
@Component
public class TransactionElavonSaleListener {

    public TransactionResponseFactory transactionElavonSaleProcess(TransactionRequestFactory ro) {
        ..... do some heavy network request
        return parseRawSuccessResponse(response);
    }

}

当我删除其中一个SimpleMessageListenerContainer时,它是工作文件,但是当我使用这两种方法时,我得到了这个异常:

代码语言:javascript
复制
00:40:14,469 INFO  [stdout] (pool-9-thread-5) 00:40:14.468 [pool-9-thread-5] WARN  o.s.amqp.rabbit.core.RabbitTemplate - Reply received after timeout for 1
00:40:14,472 INFO  [stdout] (pool-9-thread-5) 00:40:14.472 [pool-9-thread-5] WARN  o.s.a.r.l.ConditionalRejectingErrorHandler - Execution of Rabbit message listener failed.
00:40:14,473 INFO  [stdout] (pool-9-thread-5) org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener threw exception
00:40:14,473 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.wrapToListenerExecutionFailedExceptionIfNeeded(AbstractMessageListenerContainer.java:1613)
00:40:14,473 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1517)
00:40:14,473 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1440)
00:40:14,473 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1428)
00:40:14,473 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1423)
00:40:14,473 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1372)
00:40:14,473 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.DirectMessageListenerContainer$SimpleConsumer.callExecuteListener(DirectMessageListenerContainer.java:995)
00:40:14,473 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.DirectMessageListenerContainer$SimpleConsumer.handleDelivery(DirectMessageListenerContainer.java:955)
00:40:14,474 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:149)
00:40:14,474 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:104)
00:40:14,474 INFO  [stdout] (pool-9-thread-5)   at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
00:40:14,474 INFO  [stdout] (pool-9-thread-5)   at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
00:40:14,478 INFO  [stdout] (pool-9-thread-5)   at java.base/java.lang.Thread.run(Thread.java:844)
00:40:14,481 INFO  [stdout] (pool-9-thread-5) Caused by: org.springframework.amqp.AmqpRejectAndDontRequeueException: Reply received after timeout
00:40:14,494 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.core.RabbitTemplate.onMessage(RabbitTemplate.java:2446)
00:40:14,494 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.DirectReplyToMessageListenerContainer.lambda$setMessageListener$1(DirectReplyToMessageListenerContainer.java:115)
00:40:14,494 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1514)
00:40:14,494 INFO  [stdout] (pool-9-thread-5)   ... 11 common frames omitted
00:40:14,495 INFO  [stdout] (pool-9-thread-5) 00:40:14.495 [pool-9-thread-5] ERROR o.s.a.r.l.DirectReplyToMessageListenerContainer - Failed to invoke listener
00:40:14,495 INFO  [stdout] (pool-9-thread-5) org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener threw exception
00:40:14,495 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.wrapToListenerExecutionFailedExceptionIfNeeded(AbstractMessageListenerContainer.java:1613)
00:40:14,495 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1517)
00:40:14,496 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1440)
00:40:14,496 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1428)
00:40:14,496 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1423)
00:40:14,496 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1372)
00:40:14,496 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.DirectMessageListenerContainer$SimpleConsumer.callExecuteListener(DirectMessageListenerContainer.java:995)
00:40:14,496 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.DirectMessageListenerContainer$SimpleConsumer.handleDelivery(DirectMessageListenerContainer.java:955)
00:40:14,496 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:149)
00:40:14,496 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:104)
00:40:14,496 INFO  [stdout] (pool-9-thread-5)   at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
00:40:14,496 INFO  [stdout] (pool-9-thread-5)   at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
00:40:14,497 INFO  [stdout] (pool-9-thread-5)   at java.base/java.lang.Thread.run(Thread.java:844)
00:40:14,497 INFO  [stdout] (pool-9-thread-5) Caused by: org.springframework.amqp.AmqpRejectAndDontRequeueException: Reply received after timeout
00:40:14,497 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.core.RabbitTemplate.onMessage(RabbitTemplate.java:2446)
00:40:14,497 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.DirectReplyToMessageListenerContainer.lambda$setMessageListener$1(DirectReplyToMessageListenerContainer.java:115)
00:40:14,497 INFO  [stdout] (pool-9-thread-5)   at deployment.rest_api.war//org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1514)
00:40:14,497 INFO  [stdout] (pool-9-thread-5)   ... 11 common frames omitted

当我有这两种方法的时候,你知道为什么我会得到这个异常吗?

EDITL定义了侦听器:

代码语言:javascript
复制
    @Bean
    public SimpleMessageListenerContainer processingTransactionElavonSaleContainer(ConnectionFactory cf, TransactionElavonSaleListener listener) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cf);
        container.setQueueNames(QUEUE_PROCESSING_ELAVON_SALE);
        container.setMessageListener(new MessageListenerAdapter(listener, "transactionElavonSaleProcess"));
        return container;
    }

    @Bean
    public SimpleMessageListenerContainer processingTransactionElavonAuthorizeContainer(ConnectionFactory cf, TransactionElavonAuthorizeListener listener) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cf);
        container.setQueueNames(QUEUE_PROCESSING_ELAVON_AUTHORIZE);
        container.setMessageListener(new MessageListenerAdapter(listener, "transactionElavonAuthorizeProcess"));
        return container;
    }

..。

代码语言:javascript
复制
@Component
public class TransactionElavonSaleListener {

    public TransactionResponseFactory transactionElavonSaleProcess(TransactionRequestFactory ro) {

        return new TransactionResponseFactory();
    }
}


@Component
public class TransactionElavonAuthorizeListener {

    public TransactionResponseFactory transactionElavonAuthorizeProcess(TransactionRequestFactory tf) {

        TransactionResponseFactory obj = new TransactionResponseFactory();                  
        return obj;
    }
}

发送对象:

代码语言:javascript
复制
TransactionResponseFactory processingPeply = (TransactionResponseFactory) processingTransactionElavonAuthorizeTemplate.convertSendAndReceive(
        ContextServer.EXCHANGE_PROCESSING, ContextServer.ROUTING_KEY_PROCESSING_TRANSACTION_ELAVON, tf);
    System.out.println("!!!!! Received PROCESSING_TRANSACTION " + processingPeply.getTransaction_id());
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-15 13:25:34

关于您的配置的观察(然而,与您的问题无关).

  • 不需要在您的declare...中使用AmqpAdmin代码。
    • 在bean定义阶段,永远不会与代理交互,--太早了。
    • 它们不是必需的,因为管理员将找到QueueExchange bean,并在首次打开连接时为您自动声明它们。

是的,消息转换器设置器不用于这类侦听器;应该在MessageListenerAdapter上设置消息转换器。

但是,默认情况下,它会获得一个SimpleMessageConverter,这样就不会有问题了;这个转换器处理序列化对象和纯文本。

现在,针对实际问题;添加第二个容器不应对客户端产生任何影响;每个模板都会获得自己的应答容器和直接回复--默认情况下将使用它们,因此它们之间不会发生交叉对话(如果使用指定的应答队列,则可能发生这种情况,但这里不是这样的)。

我建议您打开调试日志,以了解发生了什么;如果需要帮助,请分析它们;发布日志(来自客户端和服务器端),我将查看一下。

编辑

绑定不正确:

代码语言:javascript
复制
@Bean
public Binding bindingQueueProcessingElavonSale() {
    return BindingBuilder.bind(new Queue(QUEUE_PROCESSING_ELAVON_SALE, true))
            .to(new TopicExchange(EXCHANGE_PROCESSING)).with(ROUTING_KEY_PROCESSING_TRANSACTION_ELAVON);
}

@Bean
public Binding bindingQueueProcessingElavonAuthorize() {
    return BindingBuilder.bind(new Queue(QUEUE_PROCESSING_ELAVON_AUTHORIZE, true))
            .to(new TopicExchange(EXCHANGE_PROCESSING)).with(ROUTING_KEY_PROCESSING_TRANSACTION_ELAVON);
}

使用相同的路由密钥将两个队列绑定到同一个交换-- RabbitMQ将使用该路由键向两个队列发送消息,因此两个侦听器都将响应。

票数 1
EN

Stack Overflow用户

发布于 2019-09-03 19:14:23

convertSendAndReceive的默认超时时间是5秒。若要将超时设置属性replyTimeout of AmqpTemplate修改为更大的值(毫秒),请执行以下操作。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54190371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档