spring集成http入站网关concurency问题

时间:2016-12-04 12:19:13

标签: spring spring-integration

我是Spring集成的新手,我的要求是我将获得一个http请求到我的spring集成然后我需要按照以下步骤。

1)获取Http请求 2)发送给第三方(MQ) 3)将收到MQ的响应 4)处理消息并发回客户端。

我完成了这个应用程序并且工作正常,但是如果我同时收到多个请求,我面临的问题就像,在向Thridaprty发送请求时,我正在我的标题中构建一些UUID和correlID并保留在我的本地缓存,所以如果多个请求同时出现,我的代码就会创建相同的correlID。

我怀疑在同一毫秒时有多个请求存在问题。

请指导我出错的地方。

这是我的configuraiton,它适用于单个请求。

<int-http:inbound-gateway id="requestGateway"
                          supported-methods="GET" 
                          request-channel="requestChannel"
                          reply-channel="replyChannel" 
                          path="${cuteRequestURL}"
                          reply-timeout="${cuteRequestTimeout}" 
                          >
</int-http:inbound-gateway>

<int:channel id="requestChannel"/>

<bean id="mapToSI"  class="aero.sita.fw.cutelvihttp.helper.TransformLinkedMultiValueMapToSIMsg"/>

<int:transformer    id="abc" 
                    input-channel="requestChannel" 
                    output-channel="Map" 
                    ref="mapToSI"
                    method="transformLinkeMapToSpringIntegrationMessage" />

<int:channel id="Map"/>                 

<bean id="constructRequiredParams"  class="SomeParamLogic">
    <constructor-arg name="Value1" value="A"  />
    <constructor-arg name="Value2" value="B"  />
    <constructor-arg name="Value3" value="C"  />
</bean> 

<int:transformer    id="constructMessageHeaderVendor" 
                    input-channel="Map" 
                    output-channel="inputRequestChannel" 
                    ref="constructRequiredParams"
                    method="amend" />

<int:channel id="inputRequestChannel" />

<int:service-activator input-channel="inputRequestChannel"
                       output-channel="responseValidatorChannel" 
                       method="xyz"
                       ref="serviceActivator"/>

<int:channel id="responseValidatorChannel"/>

<bean id="serviceActivator" class="ServiceActivator"/>

<int:channel id="replyChannel"/>

<int:channel id="dataChannel" />

<int:service-activator  input-channel="dataChannel" 
                        ref="destinationQueue"
                        method="transform"/>

<bean id="destinationQueue" class="XYZ">
    <property name="requestQueue" value="ProducerName" />
    <property name="replyQueue" value="Replier" />
</bean>

<int-xml:validating-filter discard-channel="errorChannel"
                           id="jmsInValidator" 
                           input-channel="dataChannel"
                           output-channel="nullChannel" 
                           schema-location="ThirdParty.xsd"
                           schema-type="xml-schema" 
                           throw-exception-on-rejection="true" />

<int-xml:validating-filter discard-channel="errorChannel"
                           id="jmsInValidator" 
                           input-channel="responseValidatorChannel"
                           output-channel="replyChannel" 
                           schema-location="classpath:Client.xsd"
                           schema-type="xml-schema" 
                           throw-exception-on-rejection="true" />

1 个答案:

答案 0 :(得分:0)

将评论复制到答案以便正确解决问题。

您应该考虑使用现有的uuid算法来避免冲突。还有锁存障碍来保护资源免受并发访问。任何方式问题都与Spring Integration完全相同。

  

现在我想了解线程安全

是的,确实如此。由于大多数Spring Integration组件都是无状态的,因此没有任何线程冲突。只有聚合器具有MessageStore的某种状态,但它经过了很好的测试。因此,尝试在自己的代码中找到瓶颈。