Spring 集成 - 具有返回值的消息传递网关

Spring Integration - Messaging Gateway with a returning value

我是 Spring 集成的新手。我需要实现一个具有返回值的消息传递网关。为了在执行完一些同步步骤后,继续异步处理一些。所以我制作了 2 个激活器

@Slf4j
@MessageEndpoint
public class Activator1 {

@ServiceActivator(inputChannel = "asyncChannel")
public void async(){
    log.info("Just async message");
    try {
        Thread.sleep(500);
    } catch (InterruptedException e) {
        log.error("I don't want to sleep now");
    }
}
}

@Slf4j
@MessageEndpoint
public class Activator2 {

@ServiceActivator(inputChannel = "syncChannel")
public ResponseEntity sync(){
    try {
        Thread.sleep(500);
        return ResponseEntity.ok("Return Http Message");
    } catch (InterruptedException e) {
        log.error("I don't want to sleep");
    }
    return ResponseEntity.badRequest().build();
}
}

流水线

@Configuration
public class Pipeline {

@Bean
MessageChannel asyncChannel() {
    return new DirectChannel();
}

@Bean
public MessageChannel syncChannel() {
    return MessageChannels.direct().get();
}

}

网关

@MessagingGateway
public interface ReturningGateway {

@Gateway(requestChannel = "asyncChannel", replyChannel = "syncChannel")
public ResponseEntity getSyncHttpResponse();

}

和控制器

@Slf4j
@RestController
@RequestMapping("/sync")
public class ResponseController {

@Autowired
ReturningGateway returningGateway;

@PostMapping("/http-response")
public ResponseEntity post() {
    
    return returningGateway.getSyncHttpResponse();
    
}
}

所以我不确定这是否是做我想做的事情的正确方法

你能把手给我吗?

首先让我尝试解释一些事情!

@Gateway(requestChannel = "asyncChannel", replyChannel = "syncChannel")

requestChannel 是网关发送消息的地方。但是由于您在网关方法中没有任何参数并且没有 payloadExpression,因此行为是从该通道“接收”。有关详细信息,请参阅文档:https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway-calling-no-argument-methods.

replyChannel是等待回复的地方,不是发送。在大多数情况下,网关依赖于 replyChannel header 进行关联。消息传递中的 request-reply 模式。我们需要一个明确的 replyChannel 如果它是 PublishSubscribeChannel 以某种方式跟踪回复或者当我们处理我们无法修改以依赖于 replyChannel header 的流程时.请参阅文档中相同的网关章节。

我不清楚你的 use-case:你说 async 延续,但同时你的网关合约中的 return 看起来像是 [=19] 的结果=] 方法。从这里开始,请让您自己熟悉网关合约,然后带着对您的解决方案的全新愿景回到我们这里。