2017-03-15 6 views
0

Windows 서비스에서 여러 스레드 (작업)를 사용하여 구독자와 동일한 큐에 연결하려고하므로 메시지를 더 빠르게 처리 할 수 ​​있습니다. 대기열에 연결하면 첫 번째 가입 스레드에서 메시지를 받고 나머지는 유휴 상태입니다. 다음은 내가 메시지를 구독받을 사용하고있는 코드는 다음과 같습니다websphere MQ에서 동일한 대기열에 여러 가입자가있을 수 있습니까?

private MQQueueManager _queueManager; 
private MQQueue _queue; 
private MQTopic _topic; 
public bool isSubscribed = false; 

public void Subscribe() 
{ 
    var queueManagerName = "myQueueManager"; 
    var properties = new Hashtable(); 
    //Set all the properties here 
    _queueManager = new MQQueueManager(queueManagerName, properties); 

    //Conect to Queue 
    _queue = _queueManager.AccessQueue("devQueue", MQC.MQOO_INPUT_AS_Q_DEF); 

    isSubscribed = true; 
    while (isSubscribed) 
    { 
     if (cancellationToken.IsCancellationRequested) 
     { 
      isSubscribed = false; 
      cancellationToken.ThrowIfCancellationRequested(); 
     } 
     try 
     { 
      Receive(onMessageReceived); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Exception: {0}", ex); 
     } 
    } 
} 


public override void Receive<T>(Action<T> onMessageReceived) 
{ 
    try 
    { 
     var dataReceived = new MQMessage(); 
     _queue.Get(dataReceived); 

     T message; 
     message = (T)(object)dataReceived; 

     onMessageReceived(message);  
     _queueManager.Commit(); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

가 나는 또한 중 하나가 작동하지 않았다 큐에 액세스하기위한 MQC.MQOO_INPUT_SHARED를 사용했습니다. 내가 놓친 게 있니?

+0

실행중인 MQ의 버전 (dspmqver 출력)을 알려주십시오. – JasonE

+0

@JasonE Version 8.0 – PushCode

답변

1

인용 부호가있는 코드는 "devQueue"라는 대기열에서 메시지를 열고 수신하려고 시도합니다. 이 코드가 여러 스레드에서 실행되는 경우 각 스레드에 보내는 메시지는 메시지 처리 속도와 연결 대상 MQ의 부분에 따라 다릅니다.

그러나 구독자는 구독자에 대해 언급하고 인용 한 코드는 주제와 대기열을 선언합니다. 앱의 다른 곳에서 주제에 대한 구독을 만든 다음이 코드를 사용하여 해당 구독으로 보낸 메시지를 수신하고 있습니까? 그렇다면 "대기열 수신"스레드가 구독 메시지를 보유하고있는 대기열과 다른 대기열을 여는 것일 수 있습니다. 초기 구독은 어떻게 생성됩니까?

+0

주제에 가입 중입니다. 큐에 직접 등록하고 MQ 버전 8.0을 사용하고 있습니다. 따옴표 붙은 Subscribe() 메소드가 포함 된 클래스에 대해 고유 한 인스턴스를 갖는 세 개의 개별 태스크 ('Task.Factory.StartNew')를 작성 중입니다. – PushCode

+0

MQ의 일반 관리 구독은 게시 된 메시지가 활성 구독자에게 전달되기 전에 시스템 큐를 사용하여 메시지를 보관합니다. 이 대기열은 구독이 생성 된 주제와 다른 이름을가집니다. – Luke

+0

구독 할 때 "devQueue"라는 MQQueue를 MQDestination으로 사용하여 관리되지 않는 구독을 만든 경우 해당 MQQueue를 사용하여 메시지를받을 수 있어야합니다. 구독 할 때 MQC.MQSO_MANAGED 옵션을 사용합니까? 그렇다면 옵션을 제거하십시오. 기본적으로 MQ는 대기중인 소비자에게 메시지를 보낼 때 LIFO 주문을 사용합니다. 이것은 성능상의 이유로 모든 수신 메시지를 처리 ​​할 수없고 다음 소비자에게 "유출"될 때까지 한 소비자를 선호한다는 것을 의미합니다. 이것은 하나의 스레드 만 메시지를받는 이유 일 수 있습니다. – Luke