2014-06-17 2 views
0

일부 activemq 큐에서 메시지를 소비하려고하는 Windows 서비스가 있습니다. 그러나 일부 메시지 만 받고 다른 큐는 대기중인 메시지 보류 상태에 빠져 있습니다. 액티브 메일 (ActiveMQ)은 대기열에있다는 메시지를 전하면서 ​​500 개의 메시지가 소비자에게 전달되지만 300 개는 대기열에서 제외되었다고합니다. 서비스에 둘 이상의 리스너가 설정되어 있습니다. 인정하지 않는 특정 사람들을 야기 내가 메시지를 인정하고있어 방법에 문제가ActiveMQ 큐에서 모든 메시지를 큐에서 제거하지 않는 소비자 서비스

private void setupListener(string queue, string brokerUri) 
{ 
    try 
    { 
     ISession session = connectionConsumers[brokerUri].CreateSession(); 
     session.CreateConsumer(session.GetQueue(queue)) 
       .Listener += new MessageListener(consumer_Listener); 
    } 
    catch (Exception ex) 
    { 
     Log.Error("An exception has occured setting up listener for " + queue + " on " + brokerUri + ": {0}, {1}", ex, ex.Message); 
    } 
} 

void consumer_Listener(IMessage message) 
{ 
    try 
    { 
     processLog((message as ITextMessage).Text); 
     message.Acknowledge(); 
    } 
    catch (NMSException ex) 
    { 
     Log.Error("ActiveMQ Connection Failure: {0}, {1}", ex, ex.Message); 
    } 
    catch (Exception ex) 
    { 
     Log.Error("An exception has occured trying to process a message: {0}, {1}", ex, ex.Message); 
    } 
} 

거기 다음은 코드의 중요한 부분입니까? 동시성 문제입니까? 나는 그들이 여전히 processLog 함수 (데이터베이스에 추가됨)를 통해 진행되고 있는지 확실하지 않습니다.

편집 : 나는 (어떤 이유로) 올바르게 일어나지 않는 승인과 더 관련이 있다고 생각합니다. 나는 이 아님 로그에 예외가 발생합니다. 그러나 activemq는 다음을 보여줍니다. Dispatch Queue is being filled

내가 읽은 바로는 디스패치 대기열에 소비자에게 전송되었지만 확인되지 않은 메시지가 가득 찼습니다. 왜 이럴 수 있니?

+0

소비자의 프리 패치 크기는 얼마입니까? 소비자들이 모여 있습니까? – Ralf

+0

프리 페치 크기가 기본값이므로 1000입니다. 소비자는 풀링되지 않습니다. –

+0

프리 페치를 0 (폴링)으로 설정하면 문제가 해결됩니까? 소비자가 모여 있지 않는 한 문제가되어서는 안됩니다.하지만 지금 당장 생각할 수있는 유일한 방법입니다. – Ralf

답변

0

문제는 우리 대기열이 가상 목적지 인 것과 관련이 있습니다.

관련 문제