Spring Integration错误"没有输出通道或replyChannel标头可用"

时间:2018-01-03 00:11:06

标签: spring spring-integration spring-integration-dsl spring-integration-amqp

我不知道为什么我会得到例外

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

1 个答案:

答案 0 :(得分:1)

不,这不是AMQP频道适配器问题。请看看你的handle() - 你会在那里归还一些东西。之后没有什么可以处理这种回报。那么,回复应该去哪里?是的,进入replyChannel标题。但是等等,没有人因为没有什么可以等待回复 - 通道适配器是单向组件。

由于您没有对回复执行任何操作,并且Framework无法从配置阶段假设您不打算处理此回复,因此我们只是在运行时遇到该异常。它无法做出这种假设,因为在handle()之前有一个消息通道,因此您可以从其他流程发送带有replyChannel标头的消息,依此类推。但!由于这是您的代码并且您完全控制它,您可能会假设没有人会期望从那里得到回复,最好从这一点停止流式传输。为此,最好使用基于MessageHandler的单向handle()变体,或者只返回null而不是payload。您也可以使用channel(“nullChannel”)停止播放。