redisQueueInboundGateway.setReplyChannelName是什么

时间:2020-09-24 07:31:55

标签: spring-integration

只想问一下redisQueueInboundGateway.setReplyChannelName是什么

我得到了一条日志B,然后是一条日志。

1。我的问题是,在将日志C设置为RedisQueueInboundGateway时,它将在什么情况下打印?

  1. “ https://docs.spring.io/spring-integration/reference/html/redis.html#redis-queue-inbound-gateway”中的文档似乎不适用于类名和类说明,例如:

2.1'RedisOutboundChannelAdapter'在'RedisPublishingMessageHandler'中命名。

2.2'RedisQueueOutboundChannelAdapter'在'RedisQueueMessageDrivenEndpoint'中命名。

2.3 Redis队列出站网关的解释完全是Redis队列入站网关的副本。

    @GetMapping("test")
    public void test() {
        this.teller.test("testing 1");

  @Gateway(requestChannel = "inputA")
    void test(String transaction);

  @Bean("A")
    PublishSubscribeChannel getA() {
        return new PublishSubscribeChannel();
    }

    @Bean("B")
    PublishSubscribeChannel getB() {
        return new PublishSubscribeChannel();
    }

    @Bean("C")
    PublishSubscribeChannel getC() {
        return new PublishSubscribeChannel();
    }

    @ServiceActivator(inputChannel = "A")
    void aTesting(Message message) {
        System.out.println("A");

        System.out.println(message);
    }

    @ServiceActivator(inputChannel = "B")
    String bTesting(Message message) {
        System.out.println("B");
        System.out.println(message);
        return message.getPayload() + "Basdfasdfasdfadsfasdf";
    }

    @ServiceActivator(inputChannel = "C")
    void cTesting(Message message) {
        System.out.println("C");
        System.out.println(message);
    }


    @ServiceActivator(inputChannel = "inputA")
    @Bean
    RedisQueueOutboundGateway getRedisQueueOutboundGateway(RedisConnectionFactory connectionFactory) {
        val redisQueueOutboundGateway = new RedisQueueOutboundGateway(Teller.CHANNEL_CREATE_INVOICE, connectionFactory);
        redisQueueOutboundGateway.setReceiveTimeout(5);
        redisQueueOutboundGateway.setOutputChannelName("A");
        redisQueueOutboundGateway.setSerializer(new GenericJackson2JsonRedisSerializer(new ObjectMapper()));

        return redisQueueOutboundGateway;
    }

    @Bean
    RedisQueueInboundGateway getRedisQueueInboundGateway(RedisConnectionFactory connectionFactory) {
        val redisQueueInboundGateway = new RedisQueueInboundGateway(Teller.CHANNEL_CREATE_INVOICE, connectionFactory);
        redisQueueInboundGateway.setReceiveTimeout(5);
        redisQueueInboundGateway.setRequestChannelName("B");
        redisQueueInboundGateway.setReplyChannelName("C");
        redisQueueInboundGateway.setSerializer(new GenericJackson2JsonRedisSerializer(new ObjectMapper()));

        return redisQueueInboundGateway;
    }

1 个答案:

答案 0 :(得分:0)

您的担忧不清楚。

2.1

有一个组件(模式名称),并且在后台有一个类涵盖了逻辑。 有时候它们不一样。

因此,Redis Outbound Channel AdapterRedisPublishingMessageHandler覆盖,只是因为有一个ConsumerEndpointFactoryBean消耗了来自输入通道的消息,还有RedisPublishingMessageHandler来处理它们。换句话说,框架创建了两个bean来使这种Redis交互起作用。实际上,所有出站通道适配器(网关)的处理方式都相同:端点加处理程序。根据交互的类型,它们一起称为adaptergateway

2.2

我没有在文档中看到这样的误导。

2.3

那不是事实。 查看差异:

Spring Integration引入了Redis队列出站网关,以执行请求和答复方案。它将会话UUID推送到提供的队列中,

Spring Integration 4.1引入了Redis队列入站网关,以执行请求和答复方案。它从提供的队列中弹出一个对话UUID

所有入站网关都提供了可选的replyChannel来跟踪答复。这类网关不是要发送东西的地方。完全相反:此入站网关将使用回复通道将回复消息发送回Redis的地方。入站网关是从外部启动的。在我们的情况下,作为已配置的Redis列表中的请求消息。当Integration flow完成其工作时,它将向该网关发送回复消息。在大多数情况下,它是使用邮件中的replyChannel标头自动完成的。但是,如果您想跟踪该答复,请在入站网关上添加一个PublishSubscribeChannel作为该replyChannel选项,并且服务激活器和网关都将收到相同的消息。

此消息replyChannel背后的行为在Messaging Gateway一章中进行了说明:https://docs.spring.io/spring-integration/reference/html/messaging-endpoints.html#gateway-default-reply-channel

您可能对文档https://docs.spring.io/spring-integration/reference/html/redis.html#redis-queue-inbound-gateway中的此部分正确,而那些requestChannelreplyChannel实际上是“出站网关”部分中文本的副本。那必须解决。随时提出GH问题,这样我们就不会忘记解决它。

当您向该C通道发送消息时,将打印C日志,但是再次:如果您想使Redis入站网关的回复相关性有效,则必须以{{ 1}}。否则,只需忽略它,您的PublishSubscribeChannel就会将其结果发送到String bTesting(Message message) {标头。