当响应来自使用Spring Integration DSL的RabbitMQ响应队列时,如何实现HTTP请求/响应?

我正在尝试在Spring Integration DSL中使用单独的RabbitMQ队列来实现HTTP请求/答复。这类似于对amqp queue的Spring IntegrationFlow http请求所不同的是,我希望将响应返回给原始的HTTP调用者。我可以看到测试http发布消息已成功传递到请求队列并转换为(大写形式)为响应队列。该消息也已从响应队列中使用,但再也没有返回给调用方(http:// localhost:8080 / Tunner)。最终,呼叫超时并显示500错误。我对此很陌生,所以可能有一些我完全想不到的东西。有人可以提供建议吗?代码如下:

public class TunnelApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(TunnelApplication.class, args);
    }

    @Value("${outboundQueue}")
    private String outboundQueue;

    @Value("${inboundQueue}")
    private String inboundQueue;

    private ConnectionFactory rabbitConnectionFactory;

    @Autowired
    public TunnelApplication(ConnectionFactory factory) {
        rabbitConnectionFactory = factory;
    }

    @Bean
    public Queue targetQueue()
    {
        return new Queue(outboundQueue, true, false, true);
    }

    @Bean
    public Queue requestQueue()
    {
        return new Queue(inboundQueue, true, false, true);
    }

    @Bean
    public Jackson2JsonMessageConverter jsonMessageConverter()
    {
        return new Jackson2JsonMessageConverter();
    }

    @Bean
    public AmqpTemplate amqpTemplate()
    {
        RabbitTemplate result = new RabbitTemplate(rabbitConnectionFactory);
        result.setMessageConverter(jsonMessageConverter());
        result.setDefaultReceiveQueue(outboundQueue);
        //result.setReplyAddress(outboundQueue);
        result.setReplyTimeout(60000);
        return result;
    }

    @Bean
    public IntegrationFlow sendReceiveFlow(RabbitTemplate amqpTemplate) {
        return IntegrationFlows
                .from(Http.inboundGateway("/tunnel"))
                .handle(Amqp.outboundGateway(amqpTemplate)
                        .routingKey(inboundQueue)
                        .returnChannel(amqpOutboundChannel()))
                .log()
                .bridge(null)
                .get();
    }

    @Bean
    public IntegrationFlow rabbitToWeb(RabbitTemplate amqpTemplate, ConnectionFactory connectionFactory) {
        return IntegrationFlows.from(Amqp.inboundGateway(connectionFactory, requestQueue()))
                .transform(String.class, String::toUpperCase)
                .log()
                .handle(Amqp.outboundGateway(amqpTemplate).routingKey(outboundQueue))
                .log()
                .bridge(null)
                .get();
    }

    @Bean
    public IntegrationFlow replyBackToHttp(RabbitTemplate amqpTemplate, ConnectionFactory connectionFactory) {
        return IntegrationFlows.from(Amqp.inboundGateway(connectionFactory, targetQueue()))
                .handle(Http.outboundGateway("http://localhost:8080/tunnel")
                       .expectedResponseType(String.class))
                .log()
                .bridge(null)
                .channel(amqpOutboundChannel())
                .get();
    }

    @Bean
    public MessageChannel amqpOutboundChannel() {
    return new DirectChannel();
}

我们还尝试了以下代码(由我的同事执行),但也没有得到响应:

@Configuration
@EnableIntegration
public class FlowConfig {

 

   @Value("${routingKey}")
   private String routingKey;

 

   @Value("${rabbitSinkChannel}")
   private String rabbitSinkChannel;

 

   @Bean
   public MessageChannel rabbitSinkChannel(ConnectionFactory connectionFactory) {
      return
         Amqp
         .channel(rabbitSinkChannel, connectionFactory)
         .get();
   }

 

   @Bean
   public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
      return new RabbitTemplate(connectionFactory);
   }

 

   @Bean
   public IntegrationFlow httpFlow(RabbitTemplate rabbitTemplate, ConnectionFactory connectionFactory) {
      MessageChannel rabbitSinkChannel = rabbitSinkChannel(connectionFactory);

 

      return IntegrationFlows
         .from(
            Http.inboundGateway("/sendreceive")
         )
         .handle(
            Amqp.outboundGateway(rabbitTemplate)
               .routingKey(routingKey)
               .returnChannel(rabbitSinkChannel)
         )
         .channel(rabbitSinkChannel) // or .handle? if so, what?

 

         .get();
   }
}

以下更新有效(我还删除了ReplyBackToHttp()方法):

@Bean
public AmqpTemplate amqpTemplate()
{
    RabbitTemplate rabbitTemplate = new RabbitTemplate(rabbitConnectionFactory);
    rabbitTemplate.setMessageConverter(jsonMessageConverter());
    //result.setDefaultReceiveQueue(outboundQueue);
    rabbitTemplate.setReplyAddress(outboundQueue);
    rabbitTemplate.setReplyTimeout(60000);
    rabbitTemplate.setUseDirectReplyToContainer(false);
    return rabbitTemplate;
}

@Bean
public SimpleMessageListenerContainer replyListenerContainer() {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(rabbitConnectionFactory);
    container.setQueues(replyQueue());
    container.setMessageListener((MessageListener) amqpTemplate());
    return container;
}

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当响应来自使用Spring Integration DSL的RabbitMQ响应队列时,如何实现HTTP请求/响应?

来自分类Dev

在Spring Integration中使用来自REST调用的XML响应

来自分类Dev

Spring Integration 4异步请求/响应

来自分类Dev

在Spring Integration中处理http响应

来自分类Dev

Spring Integration - 如何通过同一连接实现异步 TCP 套接字请求/响应?

来自分类Dev

Spring Integration:添加对实际消息的响应

来自分类Dev

Spring Integration-IP-收到多个响应

来自分类Dev

Spring Integration异步网关响应处理

来自分类Dev

使用 Spring Integration 优化使用来自rabbitmq 的消息

来自分类Dev

使用 Spring Integration 将消息发送到套接字端口并接收响应

来自分类Dev

通过Spring Integration中的Rest响应过滤消息

来自分类Dev

如何使用Spring Integration DSL配置StepExecutionListener

来自分类Dev

用于XML Web Service的Spring Integration http-outbound-gateway不返回响应数据

来自分类Dev

用于XML Web Service的Spring Integration http-outbound-gateway不返回响应数据

来自分类Dev

Spring Integration HTTP

来自分类Dev

如何在HTTP请求中使用来自Jmeter JDBC请求的响应

来自分类Dev

如何在HTTP请求中使用来自Jmeter JDBC请求的响应

来自分类Dev

如何在Spring Integration中从Axis2获取响应消息

来自分类Dev

Spring Integration DSL JMS请求/答复流

来自分类Dev

如何配置Spring Integration?

来自分类Dev

如何获得http请求的响应

来自分类Dev

如何使用Wiremock中的响应模板使用来自请求的数据设置响应正文值?

来自分类Dev

如何截获来自$ http的呼叫并根据请求的类型提供响应?

来自分类Dev

使用Java DSL的Spring Batch Integration配置

来自分类Dev

如何使用TypeScript处理来自API的响应

来自分类Dev

Spring Integration DSL:HTTP出站网关

来自分类Dev

使用 HTTP 响应实现 Dialogflow

来自分类Dev

Spring Integration DSL FTP问题

来自分类Dev

Spring Integration DSL通道支持

Related 相关文章

  1. 1

    当响应来自使用Spring Integration DSL的RabbitMQ响应队列时,如何实现HTTP请求/响应?

  2. 2

    在Spring Integration中使用来自REST调用的XML响应

  3. 3

    Spring Integration 4异步请求/响应

  4. 4

    在Spring Integration中处理http响应

  5. 5

    Spring Integration - 如何通过同一连接实现异步 TCP 套接字请求/响应?

  6. 6

    Spring Integration:添加对实际消息的响应

  7. 7

    Spring Integration-IP-收到多个响应

  8. 8

    Spring Integration异步网关响应处理

  9. 9

    使用 Spring Integration 优化使用来自rabbitmq 的消息

  10. 10

    使用 Spring Integration 将消息发送到套接字端口并接收响应

  11. 11

    通过Spring Integration中的Rest响应过滤消息

  12. 12

    如何使用Spring Integration DSL配置StepExecutionListener

  13. 13

    用于XML Web Service的Spring Integration http-outbound-gateway不返回响应数据

  14. 14

    用于XML Web Service的Spring Integration http-outbound-gateway不返回响应数据

  15. 15

    Spring Integration HTTP

  16. 16

    如何在HTTP请求中使用来自Jmeter JDBC请求的响应

  17. 17

    如何在HTTP请求中使用来自Jmeter JDBC请求的响应

  18. 18

    如何在Spring Integration中从Axis2获取响应消息

  19. 19

    Spring Integration DSL JMS请求/答复流

  20. 20

    如何配置Spring Integration?

  21. 21

    如何获得http请求的响应

  22. 22

    如何使用Wiremock中的响应模板使用来自请求的数据设置响应正文值?

  23. 23

    如何截获来自$ http的呼叫并根据请求的类型提供响应?

  24. 24

    使用Java DSL的Spring Batch Integration配置

  25. 25

    如何使用TypeScript处理来自API的响应

  26. 26

    Spring Integration DSL:HTTP出站网关

  27. 27

    使用 HTTP 响应实现 Dialogflow

  28. 28

    Spring Integration DSL FTP问题

  29. 29

    Spring Integration DSL通道支持

热门标签

归档