2012-05-18 4 views
1

우리는 외부 시스템으로부터의 많은 메시지가 비동기 적으로 처리되어야한다는 시나리오가있다. 현재 디자인은 외부 시스템으로부터 msg를 풀기 위해 매 5 분마다 깨어나서 원시 msg를 지속시킨 다음 메시지 ID를 ExecutorChannel에 보낸다. , 소비자 (잠재적으로 많은)가 채널에서 소비 할 수 있습니다.스프링 통합 대기열, 현재 대기열 크기를 얻는 방법은 무엇입니까?

우리가 직면 한 문제는 msg가 대기열에있는 동안 시스템 충돌을 처리하는 방법입니다. 작업이 일어날 때마다 대기열에없는 원시 메시지가 있는지 알아보기 위해 DB를 조사해야합니다.

가장 쉬운 방법은 현재 큐 크기를 쿼리하고 큐에 msg보다 원시 메시지가 많은지 확인하는 것입니다. 그래서 내가 가진 질문은 : ExecutorChannel에 대한 모든 API가 대기열의 크기를 알 수 있습니까? 또는 다른 제안?

들으 제이슨

답변

1

봄 통합 자체는 ExecutorChannel 내에서 큐를 유지하지 않는다; 메시지는 기본 Executor에 의해 실행됩니다.

채널 전용 Spring ThreadPoolTaskExecutor를 사용하는 경우 채널의 기본 ThreadPoolTaskExecutor의 ThreadPoolExecutor로 드릴 다운하고 해당 BlockingQueue (getQueue())에 대한 핸들을 가져 와서 카운트를 얻을 수 있습니다.

그러나 활성 작업 수를 추가해야합니다.

ThreadPoolExecutor에는 대기중인 활성 작업 수를 가져 오는 기본 방법이 없기 때문에 총 수는 대략적입니다.