处理单个消息时如何处理多个REST调用

时间:2014-07-24 03:05:57

标签: rest spring-integration

我创建了一个REST API,它是从Spring Integration应用程序调用的。当前消息进入具有以下有效载荷的SI应用程序。

{
  "trackNumber" : "XYZ123",
  "products": [
    {"model" : "MODEL",
     "description" : "NAME"
    }]
}

当前的REST API可以使用以下配置将此有效负载作为单个POST处理。

<int:chain id="chain" input-channel="addChannel">               
        <int:header-enricher >
            <int:header name="content-type" value="application/json"></int:header>  
        </int:header-enricher>
        <int-http:outbound-gateway id="appointment"
            url="http://test.com/appointments/"
            http-method="POST"
            expected-response-type="java.lang.String"
            charset="UTF-8"/>       
    </int:chain>

现在我想知道的是如何通过调用POST来创建仅包含曲目编号的实体来处理消息。

然后为每个产品进行另一次POST调用。

一旦我打破了单独的呼叫,http出站网关将不再起作用,因为它没有传递完整的消息,因此我无法再次打电话来创建产品。

我遇到问题的另一件事是处理失败。例如,如果产品没有保存并失败,那么我如何才能最好地处理原始邮件的重新处理?

另请参考我关于使用spring数据休息的其他问题。

Can't POST a collection

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您只需要为trackNumber发送一个请求,如果是200 OK,请逐个处理products中的每个项目。

我会说它应该是这样的:

<int:chain input-channel="sendChannel">
    <int:header-enricher >
        <int:header name="content-type" value="application/json"/>
        <int:header name="originalPayload" expression="payload"/>
    </int:header-enricher>
    <int:transformer expression="#jsonPath(payload, '$.trackNumber')"/>
    <int-http:outbound-gateway url="http://test.com/appointments/"
                      http-method="POST"
                      expected-response-type="java.lang.String"
                      charset="UTF-8">
        <int-http:request-handler-advice-chain>
            <int:retry-advice/>
        </int-http:request-handler-advice-chain>
    </outbound-gateway>
    <int:splitter expression="#jsonPath(headers.originalPayload, '$.products')"/>
    <int:object-to-json-transformer/>
    <int-http:outbound-gateway url="http://test.com/appointments/"
                      http-method="POST"
                      expected-response-type="java.lang.String"
                      charset="UTF-8"/>
</int:chain>

当然,您应该根据您的要求对其进行抛光,并且可以为trackNumber值构建新的JSON。

使用此配置:

  1. 入站payload存储在headers中以供将来重复使用。

  2. #jsonPath SpEL功能拯救了整个JSON的某些部分

  3. 第一个<int-http:outbound-gateway>仅针对trackNumber发送请求

  4. <int:retry-advice/>在发生故障时为HTTP端点提供retry能力。

  5. <int:splitter> #jsonPath为每个product填充消息

  6. <int:object-to-json-transformer/>Map product转换为JSON

  7. 第二个<int-http:outbound-gateway>发送每个product的请求。