2010-11-25 2 views
5

.Net 프로그램에서 ActiveMQ를 사용하고 있으며 메시지 이벤트가 넘쳐납니다.C# 응용 프로그램에서 ActiveMQ에서 오는 메시지 양을 어떻게 조절할 수 있습니까?

즉, 큐 이벤트 'onMessage (IMessage receivedMsg)'를 얻으면 메시지를 내부 스레드로 보내고 X 스레드는 해당 메시지를 처리합니다.

처음에는 'AcknowledgementMode.AutoAcknowledge'를 사용하여 세션을 만들었으므로 대기열의 모든 메시지가 빨려 들어서 메모리 대기열에 들어갔다는 것을 추측하고 있습니다 (충돌로 인해 모든 것이 위험합니다). 잃어버린).

그래서 세션을 만들 때 'AcknowledgementMode.ClientAcknowledge'를 사용했고 작업자가 메시지를 준비 할 때 메시지의 'commit()'메서드를 호출합니다. 그러나 여전히 모든 메시지가 대기열에서 빠져 나옵니다.

X 개의 메시지 만 처리 중이거나 내부 대기열에 있고 모든 것이 '다운로드 중'이 아니라는 것을 어떻게 구성 할 수 있습니까?

+0

ActiveMQ를 한번도 본 적이 없지만 ActiveMQ 리스너와 함께 N 개의 스레드를 설정하고 수신 이벤트 내에서 메시지를 처리합니까? –

+0

@will hughes : 내 전체 프로그램은 비동기 방식으로 작성됩니다. 따라서 DB 액세스조차도 콜백과 비동기 적으로 수행됩니다. 그래서 나는 그 사건에 남을 수 없다. – Toad

답변

3

.NET 4.0에 있습니까? BlockingCollection을 사용할 수 있습니다. 포함될 수있는 최대량으로 설정하십시오. 스레드가 초과 요소를 넣으려고하면 모음이 임계 값 아래로 다시 떨어질 때까지 추가 작업이 차단됩니다.

어쩌면 스로틀 링을 위해 그렇게 할 수 있을까요?

또한 Rx 프레임 워크에서 스로틀 링을위한 API가 있지만 구현 방법을 모르겠습니다. 대기열 소스를 Observable로 구현하면이 API를 사용할 수있게되지만 이것이 필요한지는 알 수 없습니다.

+0

좋은 답변입니다! 매력처럼 작동합니다. 감사합니다 – Toad

2

클라이언트 프리 페치를 설정하여 클라이언트가 전송할 메시지 수를 제어 할 수 있습니다. Session이 Auto Ack에있을 때 클라이언트는 onMessage 콜백을 통해 또는 동기 수신을 통해 앱에 전달 된 메시지 만 확인합니다. 기본적으로 클라이언트는 브로커에서 1000 개의 메시지를 미리 가져오고, 클라이언트가 다운되면 다른 클라이언트에게 다시 배달됩니다. 그렇지 않으면 대기열이라는 주제로 폐기됩니다. 프리 페치를 1로 설정하면 클라이언트는 서버로부터 하나의 메시지 만 전송되고 onMessage 콜백이 완료 될 때마다 클라이언트가 해당 메시지를 확인한 것처럼 새 메시지가 발송됩니다 (즉, 세션이 자동 수신인 경우). 방법.

모든 옵션에 대한 NMS 구성 페이지를 참조하십시오 http://activemq.apache.org/nms/configuring.html

감사

팀을. FuseSource.com

+0

bish : 불행히도, 내가 clientacknowledge로 설정하더라도, 대기열은 메시지가 대기열에있는 것처럼 많은 이벤트를 발생시킵니다. 나는 그것을 큐에서 10.000 messqges로 테스트했고, 아무 것도 인정하지 않고 해고 될 것이다. 중지하는 유일한 방법은 내가 처리 할 때까지 onMessage를 중지하는 것입니다. – Toad

+0

동기식 수신 호출을 사용하면 프로그래밍 모델과 같은 사운드가 더 적합 할 수 있습니다. 그런 다음 원하는 모든 것을 조절할 수 있습니다. 메시징 시스템의 요점은 최대한 빨리 메시지를 전달하는 것이므로 스로틀을 처리해야합니다. –

관련 문제