我创建了一个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数据休息的其他问题。
答案 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。
使用此配置:
入站payload
存储在headers
中以供将来重复使用。
#jsonPath
SpEL功能拯救了整个JSON的某些部分
第一个<int-http:outbound-gateway>
仅针对trackNumber
发送请求
<int:retry-advice/>
在发生故障时为HTTP端点提供retry
能力。
<int:splitter>
#jsonPath
为每个product
填充消息
<int:object-to-json-transformer/>
将Map
product
转换为JSON
第二个<int-http:outbound-gateway>
发送每个product
的请求。