2016-12-04 2 views
1

Ich bin neu zu Frühling Integration, meine Anforderung ist, ich werde eine HTTP-Anfrage an meine Frühjahr Integration dann muss ich die folgenden Schritte folgen.Federintegration http eingehende Gateway courcency Problem

1) erhalten die HTTP-Anforderung 2) senden (MQ) 3) zu Drittanbietern wird die Antwort von MQ 4) verarbeitet die Nachricht und senden zurück an den Client empfangen.

Ich bin fertig mit dieser Anwendung und funktioniert gut, aber wenn ich mehrere Anfragen zur gleichen Zeit bekomme, habe ich ein Problem wie, beim Senden von Anfrage an Thridaprty ich baue einige UUID und correlID in meinem Header und in meinem halten lokaler Cache, wenn also mehrere Anfragen zur gleichen Zeit eingehen, erzeugt mein Code die gleichen correlIDs.

Ich vermute, es gibt ein Problem mit mehreren Anfragen bei gleichen Millisekunden.

bitte führen Sie mich, was schief läuft.

Hier ist meine Konfiguration, die für einzelne Anfrage funktioniert.

<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" /> 
+0

Nicht sicher, warum Sie Integrationskonfiguration zeigen, dass Sie sich selbst bestätigen, dass die Race-Bedingung in Ihrem Code diese UUID und Korrelation generiert. Ich denke, du solltest das stattdessen zeigen. Und noch besser schreibe einfach einen Testfall, um den Race-Zustand zu erkennen. Otoh sollten Sie denken, vorhandene Uuid-Algorithmen zu verwenden, um Kollisionen zu vermeiden. Außerdem gibt es 'Latch'-Barrieren, um Ressourcen vor gleichzeitigem Zugriff zu schützen. Irgendwelche Probleme, die von Frühling Integration völlig entfernt sind –

+0

Vielen Dank Artem Bilan für Ihre Antwort. – user3749024

+0

Vielen Dank Artem Bilan für Ihre Antwort.Lesen Sie mich Reframe meine Frage, ist Frühjahr Integration Thread sicher? Ich benutze Service-Aktivator zu Drittanbieter-Antwort zu hören (Anfrage/Antwort), sobald ich die Antwort zurück zum HTTP-Client. HTTP -> meine Anwendung ist synchronus und meine Anwendung -> MQ Applicaiotn ist Aysnchrouns, also wird der Serviceaktivator die Threadsicherheit hier beibehalten, das ist was ich fragen möchte, bitte bestätigen Sie, dass ich die UUID-Erstellung geändert habe Problem gelöst, jetzt möchte ich in Bezug auf Thread sicher wissen – user3749024

Antwort

0

Kopieren von Kommentaren auf die Antwort für das Schließen der richtigen Frage.

Sie sollten überlegen, vorhandene Uuid-Algorithmen zu verwenden, um Kollisionen zu vermeiden. Es gibt auch Verriegelungsbarrieren, um Ressourcen vor gleichzeitigem Zugriff zu schützen. Irgendwelche Probleme scheinen von der Frühjahrsintegration weit entfernt zu sein.

jetzt i in Bezug auf Thread wissen wollen sicher

Ja, es ist. Da die meisten Spring Integration-Komponenten zustandslos sind, gibt es keine Thread-Kollision. Nur Aggregator hat eine Art von Zustand mit der MessageStore, aber es ist gut getestet. Versuchen Sie also, einen Flaschenhals in Ihrem eigenen Code zu finden.

Verwandte Themen