Spring Integration和RabbitMQ:接收消息时没有可用的output-channel或ReplyChannel标头

BartekN

我用请求和回复编写了一个简单的消息流。我必须使用两个独立的队列,所以我声明AmqpOutboundAdapter发送消息,并声明AmqpInboundAdapter接收回复。

@Bean
@FindADUsers
public AmqpOutboundEndpoint newFindADUsersOutboundAdapter() {
    return Amqp.outboundAdapter(amqpTemplate())
            .routingKeyExpression("headers[" + ADUsersFindConfig.ROUTING_KEY_HEADER + "]")
            .exchangeName(getExchange())
            .headerMapper(amqpHeaderMapper())
            .get();
}

@Bean
public AmqpInboundChannelAdapter newFindADUsersResponseInboundChannelAdapter(
        ADUsersFindResponseConfig config) {
    return Amqp.inboundAdapter(rabbitConnectionFactory(), findADUsersResponseQueue)
            .headerMapper(amqpHeaderMapper())
            .outputChannel(config.newADUsersFindResponseOutputChannel())
            .get();
}

它应该与@MessagingGateway一起使用:

@MessagingGateway
public interface ADUsersFindService {

     String FIND_AD_USERS_CHANNEL = "adUsersFindChannel";

     String FIND_AD_USERS_REPLY_OUTPUT_CHANNEL = "adUsersFindReplyOutputChannel";

     String FIND_AD_USERS_REPLY_CHANNEL = "adUsersFindReplyChannel";

     String CORRELATION_ID_REQUEST_HEADER = "correlation_id";

     String ROUTING_KEY_HEADER = "replyRoutingKey";

     String OBJECT_TYPE_HEADER = "object.type";

     @Gateway(requestChannel = FIND_AD_USERS_CHANNEL, replyChannel = FIND_AD_USERS_REPLY_CHANNEL)
ADResponse find(ADRequest adRequest, @Header(ROUTING_KEY_HEADER) String routingKey, @Header(OBJECT_TYPE_HEADER) String objectType);
}

ADUsersFindResponseConfig类如下所示:

 @Configuration
 @Import(JsonConfig.class)
 public class ADUsersFindResponseConfig {

     @Autowired
     public NullChannel nullChannel;

     @Autowired
     private JsonObjectMapper<?, ?> mapper;

     /**
      * @return The output channel for the flow
      */
     @Bean(name = ADUsersFindService.FIND_AD_USERS_REPLY_OUTPUT_CHANNEL)
     public MessageChannel newADUsersFindResponseOutputChannel() {
         return MessageChannels.direct().get();
     }

     /**
      * @return The output channel for gateway
      */
     @Bean(name = ADUsersFindService.FIND_AD_USERS_REPLY_CHANNEL)
     public MessageChannel newADUsersFindResponseChannel() {
         return MessageChannels.direct().get();
     }

     @Bean
     public IntegrationFlow findADUsersResponseFlow() {
         return IntegrationFlows
                 .from(newADUsersFindResponseOutputChannel())
                 .transform(new JsonToObjectTransformer(ADResponse.class, mapper))
                 .channel(newADUsersFindResponseChannel())
                 .get();
     }
 }

发送消息工作正常,但是我在接收消息时遇到问题。我希望接收到的消息将传递到名为FIND_AD_USERS_REPLY_OUTPUT_CHANNEL的通道,然后使用findADUsersResponseFlow将消息反序列化为ADResponse对象,下一个ADResponse对象将传递给网关ReplyChannel-FIND_AD_USERS_REPLY_CHANNEL。最后,'find'方法返回该对象。不幸的是,当org.springframework.integration.handler.BridgeHandler收到一条消息时,出现异常:

 org.springframework.messaging.MessagingException: ; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available

消息日志如下所示:

 11:51:35.697 [SimpleAsyncTaskExecutor-1] INFO  New message - GenericMessage [payload={...somepayload...}, headers={correlation_id=7cbd958e-4b09-4e4c-ba8e-5ba574f3309a, replyRoutingKey=findADUsersResponse.ad, amqp_consumerQueue=findADUsersResponseQueue, history=newFindADUsersResponseInboundChannelAdapter,adUsersFindReplyOutputChannel,adUsersFindReplyChannel,infoLog,infoLoggerChain.channel#0,infoLoggerChain.channel#1, id=37a4735d-6983-d1ad-e0a1-b37dc17e48ef, amqp_consumerTag=amq.ctag-8Qs5YEun1jXYRf85Hu1URA, object.type=USER, timestamp=1469094695697}]

因此,我很确定该消息已传递给adUsersFindReplyChannel。同样(如果重要的话),请求消息和回复消息都将'replyTo'标头设置为null。我究竟做错了什么?

加里·罗素

replyChannel头部是一个活生生的对象,不能在AMQP序列化。

您可以使用出站网关而不是一对适配器,并且框架将处理标头。

如果由于某种原因必须使用适配器,则需要做两件事:

  1. 使用标头通道注册表将通道对象转换为在注册表中注册的字符串。

  2. 确保将标头映射器配置为发送/接收replyChannel标头,并且您的接收系统在答复中返回标头。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

与Citrus的Spring集成:没有可用的output-channel或ReplyChannel标头

来自分类Dev

Spring集成:TcpOutboundGateway获得DestinationResolutionException:没有可用的输出通道或ReplyChannel标头

来自分类Dev

Spring集成:TcpOutboundGateway获得DestinationResolutionException:没有可用的输出通道或ReplyChannel标头

来自分类Dev

Spring Integration-标头丢失

来自分类Dev

Spring集成:没有可用的输出通道或回复通道标头

来自分类Dev

spring amqp 出站网关没有可用的输出通道或回复通道标头

来自分类Dev

Spring Integration:如何过滤特定的标头 - 只能使用标头映射器?

来自分类Dev

如何使用 spring 集成从 RabbitMQ 获取标头

来自分类Dev

Spring Integration入站网关http请求标头

来自分类Dev

Spring Integration编组后找不到SOAP标头

来自分类Dev

Spring Integration编组后找不到SOAP标头

来自分类Dev

将Spring Integration标头值设置为bean属性

来自分类Dev

Spring Integration不转发自定义标头?

来自分类Dev

如何在Spring-Integration中将SOAPAction标头添加到HTTP消息中?

来自分类Dev

消息标头未包含在Spring Integration DSL的错误处理中

来自分类Dev

Spring Integration和Kafka:如何根据消息头过滤消息

来自分类Dev

Spring Integration HTTP Outbound Gateway标头未在连续请求时转发

来自分类Dev

当发送给订户时,spring-integration将丢失标头

来自分类Dev

Spring-Integration-DSL 和 Soap 服务 Soap 标头未被调用

来自分类Dev

为什么在 Spring Integration 中将 ID 和 TIMESTAMP 声明为临时标头?

来自分类Dev

如何使用Spring Integration Expression验证标头是否具有属性?

来自分类Dev

没有更多消息时退出Spring Integration

来自分类Dev

Spring RestTemplate到带有自定义标头和请求对象的POST请求

来自分类Dev

Spring-XD Redis消息总线从消息中删除标头

来自分类Dev

Spring Integration DSL-可以访问标头的出站网关

来自分类Dev

如何在Spring Integration Gateway中获取自定义标头值?

来自分类Dev

Spring Integration Rest Service调用中如何在Http.outboundGateway中添加cutom标头?

来自分类Dev

Spring Integration TCP中是否可以使用自定义标头?

来自分类Dev

Spring Integration WS入站网关删除Soap空标头

Related 相关文章

  1. 1

    与Citrus的Spring集成:没有可用的output-channel或ReplyChannel标头

  2. 2

    Spring集成:TcpOutboundGateway获得DestinationResolutionException:没有可用的输出通道或ReplyChannel标头

  3. 3

    Spring集成:TcpOutboundGateway获得DestinationResolutionException:没有可用的输出通道或ReplyChannel标头

  4. 4

    Spring Integration-标头丢失

  5. 5

    Spring集成:没有可用的输出通道或回复通道标头

  6. 6

    spring amqp 出站网关没有可用的输出通道或回复通道标头

  7. 7

    Spring Integration:如何过滤特定的标头 - 只能使用标头映射器?

  8. 8

    如何使用 spring 集成从 RabbitMQ 获取标头

  9. 9

    Spring Integration入站网关http请求标头

  10. 10

    Spring Integration编组后找不到SOAP标头

  11. 11

    Spring Integration编组后找不到SOAP标头

  12. 12

    将Spring Integration标头值设置为bean属性

  13. 13

    Spring Integration不转发自定义标头?

  14. 14

    如何在Spring-Integration中将SOAPAction标头添加到HTTP消息中?

  15. 15

    消息标头未包含在Spring Integration DSL的错误处理中

  16. 16

    Spring Integration和Kafka:如何根据消息头过滤消息

  17. 17

    Spring Integration HTTP Outbound Gateway标头未在连续请求时转发

  18. 18

    当发送给订户时,spring-integration将丢失标头

  19. 19

    Spring-Integration-DSL 和 Soap 服务 Soap 标头未被调用

  20. 20

    为什么在 Spring Integration 中将 ID 和 TIMESTAMP 声明为临时标头?

  21. 21

    如何使用Spring Integration Expression验证标头是否具有属性?

  22. 22

    没有更多消息时退出Spring Integration

  23. 23

    Spring RestTemplate到带有自定义标头和请求对象的POST请求

  24. 24

    Spring-XD Redis消息总线从消息中删除标头

  25. 25

    Spring Integration DSL-可以访问标头的出站网关

  26. 26

    如何在Spring Integration Gateway中获取自定义标头值?

  27. 27

    Spring Integration Rest Service调用中如何在Http.outboundGateway中添加cutom标头?

  28. 28

    Spring Integration TCP中是否可以使用自定义标头?

  29. 29

    Spring Integration WS入站网关删除Soap空标头

热门标签

归档