为什么带有 void return 的网关正在生成异步流,但在 return 值时却同步? Spring 整合

Why does Gateway with void return is making async flow but it does sync when it return value? Spring Integration

我是 Spring 集成的新手。我正在做一些测试,我意识到当 Gateway return void 或 return String 时,我的应用程序的行为发生了变化。我正在尝试在后台(异步)处理流程,同时我 return 一条 http 消息。所以我做了一个异步管道

@Bean
MessageChannel asyncChannel() {
    return new QueueChannel(1);
}

@Bean
public MessageChannel asyncChannel2() {
    return new QueueChannel(1);
}

@Bean
public MessageChannel asyncChannel3() {
    return new QueueChannel(1);
}

@Bean(name = PollerMetadata.DEFAULT_POLLER)
PollerMetadata customPoller() {

    PeriodicTrigger periodicTrigger = new PeriodicTrigger(2000, TimeUnit.MICROSECONDS);
    periodicTrigger.setFixedRate(true);
    periodicTrigger.setInitialDelay(1000);
    
    PollerMetadata poller = new PollerMetadata();
    poller.setMaxMessagesPerPoll(500);
    poller.setTrigger(periodicTrigger);
    return poller;
}

3 个激活器

@ServiceActivator(inputChannel = "asyncChannel", outputChannel = "asyncChannel2")
public String async(String message) {
    try {
        Thread.sleep(5000);
        log.info("Activator 1 " + message);
        return message;
    } catch (InterruptedException e) {
        log.error("I don't want to sleep now");
    }
    
    return "";
}

@ServiceActivator(inputChannel = "asyncChannel2", outputChannel = "asyncChannel3")
public String async(String message){
    log.info("Activator 2 "+ message);
    try {
        Thread.sleep(2000);
        return message;
    } catch (InterruptedException e) {
        log.error("I don't want to sleep");
    }
    
    return "";
}

@ServiceActivator(inputChannel = "asyncChannel3")
public String result(String message) throws InterruptedException {
    
    Thread.sleep(2000);
    log.info("Activator 3 " + message);
    
    return message;
    
}

我收到来自控制器的消息 class

private final ReturningGateway returningGateway;

@PostMapping("/example")
public ResponseEntity post() {
    
   returningGateway.processWhileResponse("Message example");
    
    return ResponseEntity.ok(Map.of("Message","Http Done. Check the logs"));
    
}

gateway

@Gateway(requestChannel = "asyncChannel")
public void processWhileResponse(String message_example);

奇怪的是,当 gateway return 是一个 void 时,它使进程异步,所以我可以先看到 http 消息 "Http Done. Check the logs",然后我去日志,我看到了异步执行。但是当 gateway return 是 String 时,我首先看到日志,然后是 http 消息。

所以我需要 gateway return 一个值,但它保持异步方式所以我可以获得 http 消息

你能帮个忙吗?

抱歉,如果我没有使用正确的术语。谢谢

So I need the gateway returns a value but it keep the async way so I can get a http message.

只要您 return 一些非异步类型,它就会在网关调用上阻止您的代码并等待 return 值返回。即使您在该网关后面的流程是异步的,它仍会等待 replyChannelCountDownLatch 屏障上的回复。在 void return 类型的情况下,没有回复期望,并且网关在发送请求消息后立即存在。

您可能会考虑将 Future 作为 return 类型,但仍不清楚您何时想要获取值:在从您的控制器方法 returning 之前,或者已经可以了。

在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#async-gateway