我有一种情况我不知道如何管理它。
我需要的流程如下:
第一个服务发挥作用,并创建一条需要在链末端检索的消息。
当第一个服务完成时,我需要通过一个带有特定消息的新服务来调用推送通知服务器,但是有一些与步骤1中创建的信息相关的信息。
最后,我已成功发送推送通知,我必须检索在步骤1中创建的消息。
问题是,如何在生成出站网关调用时保留在步骤1中创建的消息,并从通知推送服务器检索消息?
<int:chain input-channel="v1.inputChannel.input" output-channel="v1.inputChannel.output" send-timeout="50000">
<int:header-enricher>
<int:error-channel ref="v1.inputChannel.error" />
</int:header-enricher>
<int:service-activator ref="v1.input.service" method="methodName"/>
<int:service-activator ref="v1.notificationPusher.service" method="pushNotification"/>
<int-http:outbound-gateway url="http://example.com/api/elements/:element_id/objects" http-method="POST">
<int-http:uri-variable name="element_id" expression="#pathVariables.elementId"/>
</int-http:outbound-gateway>
<!-- here the transformer needs to get the messsage from v1.input.service -->
<int:object-to-json-transformer/>
</int:chain>
答案 0 :(得分:3)
我认为你可以用这样的东西来实现这个目标:
要使用这种方法,我相信,您必须将出站和json变换器放在链外以及复制消息的逻辑。
答案 1 :(得分:3)
在对“Spring Integration in Action”进行一些研究之后,我认为解决这种情况的最佳选择是使用有线抽头模式,将推送通知服务作为辅助流程。
在这里你可以看到这本书的例子,如果我以正确的方式理解它,则auditChannel充当与主要流分开的辅助流。
<channel id="debitChannel">
<interceptors>
<wire-tap channel="auditChannel"/>
</interceptors>
</channel>
<service-activator input-channel="debitChannel" method="process">
<beans:bean class="siia.monitoring.wiretap.DebitService"/>
</service-activator>
<filter input-channel="auditChannel" expression="payload.amount > 10000" output-channel="logger"/>
<logging-channel-adapter id="logger" expression="'auditing debit: ' + payload"/>
答案 2 :(得分:0)
我可以想到一种方法,即在步骤1之后将有效负载放入标题中,然后在调用步骤3之前检索并重新填充有效负载:
<int:service-activator ref="v1.input.service" method="methodName"/>
<int:header-enricher>
<int:header name="originalpayload" expression="payload"/>
</int:header-enricher>
<int:service-activator ref="v1.notificationPusher.service" method="pushNotification"/>
<int:enricher expression="headers.originalpayload"/>
<int-http:outbound-gateway url="http://xxx.com/api/elements/:element_id/objects" http-method="POST">
<int-http:uri-variable name="element_id" expression="#pathVariables.elementId"/>
</int-http:outbound-gateway>