以前,我能够使用Spring Integration开发一个小的框架,开发人员可以在其中指定URL,HTTP方法和请求正文并调用任何外部REST API。
这是我的Spring Integration的配置
<int:channel id='reply.channel'>
<int:queue capacity='10' />
</int:channel>
<int:channel id='request.channel'/>
<int:channel id='outbound.Channel'/>
<int:gateway id="outboundGateway"
service-interface="com.bst.pm.PostGateway"
default-request-channel="outbound.Channel">
</int:gateway>
<int:object-to-json-transformer input-channel="outbound.Channel" output-channel="request.channel"/>
<int-http:outbound-gateway id="outbound.gateway"
request-channel="request.channel" url-expression="headers.bstUrl"
http-method-expression="headers.bstHttpMethod" expected-response-type-expression="headers.bstExpectedResponseType"
charset="UTF-8" reply-timeout="5000" reply-channel="reply.channel"
mapped-request-headers="bst*, HTTP_REQUEST_HEADERS">
</int-http:outbound-gateway>
然后,开发人员可以使用以下基础设施来调用外部rest API调用
@Autowired @Qualifier("reply.channel") PollableChannel receivedChannel;
@Autowired @Qualifier("request.channel") MessageChannel getRequestChannel;
@Autowired @Qualifier("outbound.Channel") MessageChannel httpOutboundGateway;
Post post = new Post();
post.setTitle("Spring INtegration Test");
post.setBody("This is a sample request body to test Spring Integration HTTP Outbound gateway");
post.setUserId(Long.valueOf(1));
Message<?> message = MessageBuilder.withPayload(post)
.setHeader("bstUrl", "https://jsonplaceholder.typicode.com/posts")
.setHeader("bstHttpMethod", "POST")
.setHeader("bstExpectedResponseType", "com.bst.pages.crm.web.Post")
.build();
httpOutboundGateway.send(message);
Message<?> receivedMsg = receivedChannel.receive();
Post post = (Post) receivedMsg.getPayload();
System.out.println("############## ServerMsg ##############");
System.out.println(o);
System.out.println("############## Done! ##############");
在这里,我想通过此集成基础结构进行所有REST调用以实现同步。但是我已经使用QUEUE通道作为http:outbound-gateway的回复通道。因此,据我所知,错误的发件人可能会收到答复,因为任何人都可以汇集邮件的渠道。
我们如何确保正确的发件人将始终收到正确的回复?
谢谢, 凯斯
答案 0 :(得分:2)
您是正确的。真正拥有一个全球答复渠道和多个并发流程,您可能最终会遇到偷工作的情况。
要解决您的问题,您需要摆脱HTTP网关上的reply-channel
,而仅依靠消息传递网关填充的replyChannel
标头。但是,您的Gateway方法实际上应该作为请求-响应签名:它必须返回Object。
请参阅《参考手册》中的有关replyChannel
标头的更多信息:https://docs.spring.io/spring-integration/docs/5.0.6.RELEASE/reference/html/messaging-endpoints-chapter.html#gateway