redisQueueInboundGateway.setReplyChannelName 有什么用

What is it for redisQueueInboundGateway.setReplyChannelName

只想问redisQueueInboundGateway.setReplyChannelName是什么

我得到了一个log B,然后是一个log。

1.My问题是我设置到RedisQueueInboundGateway后在什么情况下会打印log C

  1. “https://docs.spring.io/spring-integration/reference/html/redis.html#redis-queue-inbound-gateway”中的文档对于 class 名称和 class 解释如:

2.1 'RedisOutboundChannelAdapter' 被命名为 'RedisPublishingMessageHandler'.

2.2 'RedisQueueOutboundChannelAdapter' 被命名为 'RedisQueueMessageDrivenEndpoint'.

2.3 Redis Queue Outbound Gateway的解释就是Redis Queue Inbound Gateway的翻版

    @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;
    }

您的问题不明确。

2.1

有一个组件(模式名称),背景上有一个 class 覆盖逻辑。 有时它们不一样。

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

2.2

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

2.3

事实并非如此。 查看差异:

Spring Integration introduced the Redis queue outbound gateway to perform request and reply scenarios. It pushes a conversation UUID to the provided queue,

Spring Integration 4.1 introduced the Redis queue inbound gateway to perform request and reply scenarios. It pops a conversation UUID from the provided queue

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

replyChannel 选项背后的行为在消息网关章节中进行了解释: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 入站网关创建回复关联,它有成为 PublishSubscribeChannel。否则只需省略它,您的 String bTesting(Message message) { 会将其结果发送到 replyChannel header.