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

Spring integration Spring集成-具有返回值的消息传递网关,spring-integration,Spring Integration,我是Spring集成的新手。我需要实现一个带有返回值的消息传递网关。以便在执行某些同步步骤后异步继续某些处理。所以我做了两个激活剂 @Slf4j @MessageEndpoint public class Activator1 { @ServiceActivator(inputChannel = "asyncChannel") public void async(){ log.info("Just async message"); try

我是Spring集成的新手。我需要实现一个带有返回值的消息传递网关。以便在执行某些同步步骤后异步继续某些处理。所以我做了两个激活剂

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

管道

@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();
    
}
}
所以我不确定这是否是我想做的事情的正确方法


你能帮帮我吗?

首先让我试着解释一些事情

@网关(requestChannel=“asyncChannel”,replyChannel=“syncChannel”)

requestChannel
是网关发送消息的地方。但是由于gateway方法中没有任何参数,并且没有一个
payloadExpression
,因此行为是从该通道“接收”。有关更多信息,请参阅文档:

replyChannel
是等待回复的地方,而不是发送。在大多数情况下,网关依赖于
replyChannel
标头进行关联。消息传递中的请求-应答模式。如果是
publishsubscribebechannel
,我们需要一个显式的
replyChannel
,以某种方式跟踪回复,或者当我们处理无法修改为依赖
replyChannel
头的流时。请参阅文档中的相同网关章节


您的用例对我来说并不清楚:您说的是
async
continuation,但同时从网关契约返回的结果看起来像是该
sync()
方法的结果。从这里开始,请熟悉gateway合同,然后返回我们,为您的解决方案提供更新的愿景。

谢谢Artem。我会读更多关于网关和频道的内容
@Slf4j
@RestController
@RequestMapping("/sync")
public class ResponseController {

@Autowired
ReturningGateway returningGateway;

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