我不确定为什么会出现异常

Caused by: org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available

它只是一个简单的 IntegrationFlow,但不确定我在下面的代码中缺少什么。
  @Bean
  Exchange messageExchange() {
    return ExchangeBuilder
        .directExchange("attr")
        .durable(true)
        .build();
  }

  @Bean
  Queue queue() {
    return QueueBuilder
        .durable("attr_queue")
        .build();
  }

  @Bean
  Binding binding() {
    return BindingBuilder
        .bind(queue())
        .to(messageExchange())
        .with("attr_queue")
        .noargs();
  }

  @Bean
  IntegrationFlow deltaFlow(ConnectionFactory connectionFactory) {
    return IntegrationFlows.from(Amqp
        .inboundAdapter(connectionFactory, queue()))
        .handle(String.class, (payload, headers) -> {
          if (payload.isEmpty()) {
            log.info("Payload empty");
          } else {
            log.info("Payload : " + payload);
          }
          return payload;
        })
        .get();
  }

我试图接触 Spring Integration,但不确定为什么会出现此异常。我要做的就是使用 inboundAdapter 从队列中读取数据并将其记录到控制台。代码运行良好,但是当我向队列发布消息时,出现此异常。使用 replyChannel 适配器时是否必须始终指定 output-channelAmqp

最佳答案

不,这不是 AMQP channel 适配器问题。请看看你的 handle() - 你在那里返回了一些东西。之后没有任何东西可以处理该退货。那么,应该去哪里回复呢?对,进入 replyChannel header 。但是等等,没有人,因为没有什么可以等待回复 - channel 适配器是单向组件。

由于您对回复不做任何处理,并且框架无法从配置阶段假设您不会处理此回复,因此我们只会在运行时遇到该异常。它不能做出这样的假设,因为在 handle() 之前有一个消息 channel ,所以你可以从其他流发送带有 replyChannel header 的消息等等。但!由于这是您的代码并且您完全控制它,您可能会假设没有人会期望从那里得到答复,最好从此时停止流式传输。为此,最好使用基于 MessageHandler 的单向 handle() 变体或仅返回 null 而不是 payload 。您也可以使用 channel(“nullChannel”) 来停止流式传输。

关于Spring 集成错误 "no output-channel or replyChannel header available",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48069551/

10-11 04:20