2016-08-09 2 views
0

일부 저장 작업 중에 호출 할 통합 응용 프로그램에 HTTP 인바운드 게이트웨이가 있습니다. 그것은 이것과 같습니다. 하나의 제품이있는 경우 API를 한 번 호출하고 두 번 이상 사용하면 여러 번 호출합니다. 문제는 단일 호출의 경우 SI가 올바르게 작동한다는 것입니다. 하지만 여러 번 통화 할 경우 요청과 응답이 엉망이됩니다. 나는 스프링 통합 채널이 MQ와 같다고 생각 하나 그렇지 않습니까?스프링 통합 HTTP 인바운드 게이트웨이 요청 겹침

설명해 드리겠습니다. 제가 2 개의 제품을 가지고 있다고 가정 해 봅시다. 먼저 제품 A에 대해 SI를 호출 한 다음 B에 대해 SI를 호출합니다. A의 응답이 요청 B에 매핑되었습니다. 그것은 항상 발생합니다. 나는 첫 번째 응답을 기다리고 다시 호출 할 때까지 기다리는 것과 같은 더러운 해킹을 사용하고 싶지 않다. 이것은 시스템이 오랜 시간 동안 기다려야 함을 의미합니다. 우리는 Spring Execution에서 작업 실행자를 사용하여 작업을 수행 할 수 있다고 생각합니다. 그러나 모든 기본 샘플을 가지고 올바른 작업을 찾을 수는 없습니다. 그래서이 문제를 어떻게 해결할 수 있는지 알려주세요!

내 구성은 다음과 같습니다

<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 게이트웨이 우리는 모든 제품을 생성 할 위치입니다 웹 응용 프로그램에서 호출 것입니다. 이 통합 API는 해당 데이터를 가져 와서 백엔드 시스템에 게시하여 다른 POS 위치에도 업데이트되도록합니다!

단계 :

  1. 내가 i2nInvokeFromPOS에 제품 ID를 보내드립니다.

  2. apiTransformer -> retrieveProductJson() 메소드는 백엔드 시스템에 요청 JSON HTTP를 사용하여 보내기 ID

  3. 에 따라 DB에서 제품 정보를 가져옵니다 :의 응답을 얻기 아웃 바운드 게이트웨이

  4. 을 DB에 업로드 된 제품 상태를 백엔드로 업데이트합니다. apiService에서 발생 함 -> productResponse()

A에 대한 응답이 수신되면 요청 B에 대한 HTTP 500 오류가 발생합니다. 하지만 백엔드 API는 괜찮습니다.

답변

0

프레임 워크는 완전히 스레드로부터 안전합니다. 다른 요청/응답 사이에서 누화가 발생하면 프레임 워크가 호출하는 구성 요소 중 하나 이상이 스레드로부터 안전하지 않습니다.

예를 들어 서비스 활성기에서 호출 된 코드의 필드에 상태를 유지할 수 없습니다.

+0

그래서 뭐라고 제안 하시겠습니까? 나는 당신이 말한 것을 이해하지 못합니다 : "예를 들어, 서비스 액티베이터에서 코드를 호출하면 필드에 상태를 유지할 수 없습니다." – Rajkumar

+1

각 HTTP 요청은 별도의 스레드에서 제공됩니다. 필드간에 데이터를 저장하지 않거나 스레드 간의 누화를 방지하려면 적절한 동기화를 통해 개체를 스레드로부터 안전하게해야합니다. thread-safe 프로그래밍에 관한 좋은 책을 읽으십시오. –

+0

프런트 엔드 시스템에서 ExecutorService를 통해이 서비스를 호출합니다. 그래서 스레드 안전하다고 생각합니다. 그리고 아니요, 어디에도 데이터를 저장하지 않습니다. 내가하고있는 일은 POS에서 ID를 보내고 - DB에서 동일한 정보를 얻고 -받은 응답에 따라 DB에서 BackEnd -> 응답 받기 -> 업데이트를 보내십시오. 그러나 두 번째 응답이 SI에 도달하기 전에 HTTP 500 오류로 채널을 닫습니다. 이것이 제가 파고 있었던 것입니다. – Rajkumar

관련 문제