일부 저장 작업 중에 호출 할 통합 응용 프로그램에 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 위치에도 업데이트되도록합니다!
단계 :
내가 i2nInvokeFromPOS에 제품 ID를 보내드립니다.
apiTransformer -> retrieveProductJson() 메소드는 백엔드 시스템에 요청 JSON HTTP를 사용하여 보내기 ID
에 따라 DB에서 제품 정보를 가져옵니다 :의 응답을 얻기 아웃 바운드 게이트웨이
을 DB에 업로드 된 제품 상태를 백엔드로 업데이트합니다. apiService에서 발생 함 -> productResponse()
A에 대한 응답이 수신되면 요청 B에 대한 HTTP 500 오류가 발생합니다. 하지만 백엔드 API는 괜찮습니다.
그래서 뭐라고 제안 하시겠습니까? 나는 당신이 말한 것을 이해하지 못합니다 : "예를 들어, 서비스 액티베이터에서 코드를 호출하면 필드에 상태를 유지할 수 없습니다." – Rajkumar
각 HTTP 요청은 별도의 스레드에서 제공됩니다. 필드간에 데이터를 저장하지 않거나 스레드 간의 누화를 방지하려면 적절한 동기화를 통해 개체를 스레드로부터 안전하게해야합니다. thread-safe 프로그래밍에 관한 좋은 책을 읽으십시오. –
프런트 엔드 시스템에서 ExecutorService를 통해이 서비스를 호출합니다. 그래서 스레드 안전하다고 생각합니다. 그리고 아니요, 어디에도 데이터를 저장하지 않습니다. 내가하고있는 일은 POS에서 ID를 보내고 - DB에서 동일한 정보를 얻고 -받은 응답에 따라 DB에서 BackEnd -> 응답 받기 -> 업데이트를 보내십시오. 그러나 두 번째 응답이 SI에 도달하기 전에 HTTP 500 오류로 채널을 닫습니다. 이것이 제가 파고 있었던 것입니다. – Rajkumar