1

我有一种情况,我不知道如何处理。

我需要的流程如下:

  1. 第一个服务完成它的工作并创建一条需要在链末端检索的消息。

  2. 当第一个服务完成时,我需要通过一个带有特定消息的新服务调用推送通知服务器,但其中包含与步骤 1 中创建的消息相关的一些信息。

  3. 最后,我已经成功发送了推送通知,我必须检索在步骤 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>
4

3 回答 3

3

我认为您可以通过以下方式实现这一目标:

  1. 在发送到出站之前复制您的消息
  2. 将一个发送到出站,另一个发送到某个通道
  3. 使用具有相同出站超时时间的聚合器来“加入”它们,但实际上,您可以只传递第一步中的消息(我还没有测试过)
  4. 发送到 json 转换器

我相信,要使用这种方法,您必须将出站和 json-transformer 以及复制消息的逻辑放在链外。

于 2013-08-07T14:46:23.360 回答
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"/>
于 2013-08-08T14:08:25.577 回答
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>
于 2013-08-07T14:27:34.783 回答