Spring集成HTTP入站网关请求重叠

时间:2016-08-09 15:50:18

标签: java spring spring-mvc spring-integration

我的集成应用程序中有一个HTTP入站网关,我将在一些保存操作期间调用它。就是这样。如果我有一个产品,我会调用一次API,如果我有多次,那么我会多次调用。问题是,对于单次调用,SI工作得很好。但是对于多个呼叫,请求和响应都搞砸了。我认为Spring Integration Channels就像MQ一样,但它不是?

让我解释一下。我们说我有2个产品。首先,我为产品A调用SI,然后为B.调用A的响应映射到请求B!它一直在发生。我不想使用一些肮脏的黑客,比如等待第一个响应来再次调用。这意味着系统必须等待很长时间。我想我们可以使用任务执行器在Spring Integration中完成它,但是在那里有所有基本样本,我找不到合适的样本。所以请帮我看看如何解决这个问题!

我的配置是:

<int:channel id="n2iMotorCNInvokeRequest" />
<int:channel id="n2iMotorCNInvokeResponse" />
<int:channel id="n2iInvoketransformerOut" />
<int:channel id="n2iInvokeobjTransformerOut" />
<int:channel id="n2iInvokegatewayOut" />

<int-http:inbound-gateway id="i2nInvokeFromPOS" 
    supported-methods="GET"
    request-channel="i2nInvokeRequest"
    reply-channel="i2nInvokeResponse"
    path="/postProduct/{Id}"
    mapped-response-headers="Return-Status, Return-Status-Msg, HTTP_RESPONSE_HEADERS"
    reply-timeout="50000">
    <int-http:header name="Id" expression="#pathVariables.Id"/>
</int-http:inbound-gateway>

<int:service-activator id="InvokeActivator"
                input-channel="i2nInvokeRequest"
                output-channel="i2nInvokeResponse"
                ref="apiService"
                method="getProductId"
                requires-reply="true"
                send-timeout="60000"/>

<int:transformer input-channel="i2nInvokeResponse"
        ref="apiTransformer"
        method="retrieveProductJson" 
        output-channel="n2iInvokeRequest"/>

<int-http:outbound-gateway request-channel="n2iInvokeRequest" reply-channel="n2iInvoketransformerOut"
    url="http://10.xx.xx.xx/api/index.php" http-method="POST" 
    expected-response-type="java.lang.String">
</int-http:outbound-gateway>


<int:service-activator 
            input-channel="n2iInvoketransformerOut" 
            output-channel="n2iInvokeobjTransformerOut"
            ref="apiService" 
            method="productResponse"
            requires-reply="true"
            send-timeout="60000"/>

i2nInvokeFromPOS网关是我们从Web应用程序调用的,它将创建所有产品。此Integration API将获取该数据,并将其发布到后端系统,以便它也可以更新到其他POS位置!

步骤:

  1. 我会将productId发送到i2nInvokeFromPOS。

  2. apiTransformer - &gt; retrieveProductJson()方法将根据ID

  3. 从DB中获取产品详细信息
  4. 使用http:outbound-gateway

  5. 将请求JSON发送到后端系统
  6. 从后端获取响应并更新在数据库中上传的产品状态。发生在apiService - &gt; productResponse()

  7. 收到A的响应后,我得到的全部是请求B的HTTP 500错误!但Backend API就好了。

1 个答案:

答案 0 :(得分:0)

框架是完全线程安全的 - 如果您看到不同请求/响应之间的串扰,那么框架正在调用的一个(或多个)组件不是线程安全的。

您无法在字段中保留状态,例如,从服务激活器调用的代码。