2010-08-20 6 views
0

ActiveMQ 내에서 처리량 증가에 가장 적합한 솔루션은 각기 고유 한 세션과 소비자가있는 여러 개의 연결을 사용한다는 것입니다.ActiveMQ - 세션 당 여러 개의 연결이 필요합니까?

저는 NMS (C#을 통한 연결)를 사용하여이 작업을 수행하려했지만 MQ 웹 콘솔의 "액티브 컨슈머"화면에서 모든 연결을 볼 수 있습니다. & 소비자가 예상대로 나열되었습니다. 그 (것)들을 본다, 그러나 다음 란에서 그들은 모두 "1"의 sessionId가있다. 나는 각각에 대해 별도의 세션 ID가있을 것으로 기대했을 것이다.

이게 맞습니까? 각 연결/소비자에 대해 서로 다른 세션 ID가 있어야하는 경우 이러한 추가 세션이 생성되도록하려면 어떻게해야합니까? 여기

내가 새 연결 (이것은 Remarks ActiveMQ transactional messaging introduction code을 기반으로) 시작하는 데 사용하고 몇 가지 예제 코드입니다 :

public QueueConnection(IConnectionFactory connectionFactory, string queueName, AcknowledgementMode acknowledgementMode) 
{ 
    this.connection = connectionFactory.CreateConnection(); 
    this.connection.Start(); 

    this.session = this.connection.CreateSession(acknowledgementMode); 

    this.queue = new ActiveMQQueue(queueName); 
} 

을 ... 그리고이 난 각 연결에 대한 때마다 수행되고 열리는. 이 모든 소비자에 대한 공통 세션 (this.session)를 사용하고로서

public SimpleQueueListener CreateSimpleQueueListener(IMessageProcessor processor) 
{ 
    IMessageConsumer consumer = this.session.CreateConsumer(this.queue, "2 > 1"); 
    return new SimpleQueueListener(consumer, processor, this.session); 
} 

:

+0

어떤 ActiveMQ 및 NMS 버전을 사용하고 있습니까? – Noctris

+0

또 다른 질문 : IConnectionFactory를 만들 때 실수로 Clientid를 설정 했습니까? 나는 sourcecode를 빠르게 들여다 보았고 이것이 연결 ID와 아마도 세션까지 푸시되었음을 알았다. – Noctris

답변

0

그것은 내 문제의 근본 소스 코드의 조각을 보인다. 매번 새로운 세션을 생성하고 (콜렉션 또는 다른 수단을 사용하여) 동일한 연결 내에서 자체 세션에서 각 수신기를 작동시키는 목표를 달성했습니다. 예 :

public SimpleQueueListener CreateSimpleQueueListener(IMessageProcessor processor) 
{ 
    var listenerSession = this.connection.CreateSession(); 
    IMessageConsumer consumer = listenerSession.CreateConsumer(this.queue, "2 > 1"); 
    return new SimpleQueueListener(consumer, processor, listenerSession); 
} 
관련 문제