2014-10-06 2 views
0

여러 소스의 데이터를 받아들이는 시스템이 있습니다. 클라이언트 (내가 제어 할 수없는 제 3 자 클라이언트)는 스레드 풀의 모든 데이터 소스를 처리합니다. 콜백을 등록 할 수 있으며 다른 스레드에서 콜백이 트리거됩니다. 게이트웨이를 사용하여 별도의 채널에 데이터를 보냅니다. 각 채널을 처리 한 후 각 채널을 하나의 채널로 변환하려고했습니다. 이는 대부분의 처리가 서로 다른 출처의 데이터에서 동일하기 때문입니다. 다음은 샘플 XML스프링 통합시 여러 스레드에서 여러 스레드의 메시지를 하나의 채널로 보냅니다.

<gateway default-request-channel="a" /> 
<channel id='a'/> 
<gateway default-request-channel="b" /> 
<channel id='b'/> 
<!-- inputs to a and b can be from different threads --> 
<channel id='c' /> 

<transformer input-channel="a" output-channel="c" /> 
<transformer input-channel="b" output-channel="c" /> 

<outbound-channel-adapter channel="c" /> 

입니다 변압기가 다른 스레드에서 작동하는 것과 동일한 채널에 두 개의 변압기 출력, 동시성 문제가있을 것입니다 때? 하나의 스레드 만 'c'채널을 처리하도록 할 수 있습니까? 그렇지 않으면 동일한 채널에서 여러 스레드를 처리 할 때 권장되는 방법은 무엇입니까?

답변

-1

프레임 워크에는 이러한 동시성 문제가 없습니다. 그러나 서비스 활성기 등으로 호출되는 코드는 스레드로부터 안전해야합니다.

아웃 바운드 채널 어댑터가 POJO를 호출하는 경우 스레드 안전해야합니다. 프레임 워크 어댑터 (예 : http 등) 인 경우 스레드로부터 안전합니다.

코드 스레드를 안전하게 만들 수없는 경우 채널 c (config here)에 Executor Channel을 사용하고 단일 스레드 태스크 실행 프로그램을 사용하여 단일 스레드에서 흐름을 실행할 수 있습니다.

+0

outbound-channel-adapter를 호출하기 전에 채널'c'에서 일련의 변환/강화/라우팅을 수행해야합니다. 내 모든 POJO 메서드는 스레드로부터 안전합니다. 그런 다음''를 채널'c'에서 사용할 수 있으며 스레딩 문제는 걱정하지 않아도됩니까? ''rendezvous-queue'를 갖도록 구성된 여러 개의 스레드가있는 샘플 프로그램을'a'와'b' 채널에 보내고'c' 채널의 수신 POJO는 항상 같은 스레드 ID를 가졌습니다. – Jijith

관련 문제