用于同步REST调用的Spring Integration出站门方式

时间:2018-06-25 07:21:21

标签: spring-integration spring-integration-http

以前,我能够使用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的回复通道。因此,据我所知,错误的发件人可能会收到答复,因为任何人都可以汇集邮件的渠道。

我们如何确保正确的发件人将始终收到正确的回复?

谢谢, 凯斯

1 个答案:

答案 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