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] 的结果=] 方法。从这里开始,请让您自己熟悉网关合约,然后带着对您的解决方案的全新愿景回到我们这里。
我是 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] 的结果=] 方法。从这里开始,请让您自己熟悉网关合约,然后带着对您的解决方案的全新愿景回到我们这里。