2016-12-15 2 views
1

우리는 100 개의 작업에 약 75 개의 분할 된 단계가 적용된 응용 프로그램을 보유하고 있습니다. 아웃 바운드 게이트웨이에 대한 우리의 구성은 다음과 같습니다JmsOutboundGateway : 수동 시작 및 중지

<int-jms:outbound-gateway 
    id="outbound-gateway_1" 
    auto-startup="true" 
    connection-factory="jmsConnectionFactory" 
    request-channel="jms.requests_1" 
    request-destination="jms.requestsQueue" 
    reply-channel="jms.reply_1" 
    reply-destination="jms.repliesQueue" 
    receive-timeout="${timeout}" 
    correlation-key="JMSCorrelationID" > 
    <int-jms:reply-listener receive-timeout="1000"/> 
</int-jms:outbound-gateway> 

때 자동 시작 = "true"로 우리는 각 아웃 바운드 게이트웨이에 대한 replyListener 스레드를 참조하십시오. 이 추가로드 및 자원 소비를 제거하기 위해 autostart = "false"로 변경하고 beforeStep 및 afterStep 메소드에서 게이트웨이를 시작 및 중지하는 분할 단계에 대한 단계 리스너를 추가했습니다. 서버 시작시 replyListener 스레드는 예상대로 존재하지 않습니다. 단계 실행 도중에 나타나지만 아웃 바운드 게이트웨이에서 중지하기 위해 호출 한 후에는 제거되지 않습니다 (장기간 기다린 후에도 제거됨).

replyListener를 정리하려면 다른 것이 필요합니까?

+0

이러한 스레드가 아직 있는지 어떻게 알 수 있습니까? 스프링 통합의 어떤 버전을 사용합니까? 감사합니다. –

답변

0

확인 하시겠습니까? DefaultMessageListenerContainer.AsyncMessageListenerInvoker.executeOngoingLoop()

점에서

while ((active = isActive()) && !isRunning()) { 
    if (interrupted) { 
     throw new IllegalStateException("Thread was interrupted while waiting for " + 
       "a restart of the listener container, but container is still stopped"); 
    } 
    if (!wasWaiting) { 
      decreaseActiveInvokerCount(); 
    } 
    wasWaiting = true; 
    try { 
     lifecycleMonitor.wait(); 
    } 
    catch (InterruptedException ex) { 
     // Re-interrupt current thread, to allow other threads to react. 
     Thread.currentThread().interrupt(); 
     interrupted = true; 
    } 
} 

lifecycleMonitor.wait();하고 IllegalStateException의 메시지에주의를 기울 :처럼 그것은 보인다.

그런 디자인의 목적이 무엇인지 확실하지 않지만, 그대로 사용하지 않는 한 선택의 여지가 없습니다.

start()의 로직은 this.pausedTasks 로컬 캐시를 기반으로하며 doInitialize() 컨테이너 인 경우 !this.running 인 경우 채워집니다.

로직을 어떻게 든 변경해야한다고 생각하면 자유롭게 JIRA을 붙이십시오.

+0

우리의 모든 파티션 파티션 작업은 동일한 JMS 대기열을 수신하고 다른 채널을 사용합니다. 동일한 replyListener 인스턴스를 사용하도록 아웃 바운드 게이트웨이를 구성하는 방법이 있습니까? 1 개만 실행해야합니다 (시작 및 중지를 제거 하시겠습니까?) –

+0

를 사용하지 마십시오. use-case. 동적 샘플에 대해 정적'reply-destination '이 필요하다고 확신하지 못한다면,'TemporaryQueue' 솔루션으로 충분해야합니다. –

+0

수명이 짧은 작업을 선호하는 외부 작업 실행 프로그램을 사용하거나 명시 적으로'max-messages -per-task' (해당 executor 유형으로 10으로 설정 됨) 작업 당 최대 메시지가> 0 일 때 스레드는 해당 모니터에서 차단하는 대신 종료 (또는 풀에 넣기)합니다. –