我们可以在websphere MQ中为同一个队列拥有多个订户吗?

时间:2017-03-15 12:48:38

标签: c# ibm-mq

我正在尝试从Windows服务中获取多个线程(任务)以连接到与订阅者相同的队列,以便我可以更快地处理我的消息。当我连接到我的队列时,我在第一个订阅的线程上收到消息,其余的都是空闲的。以下是我用来订阅和接收消息的代码:

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来访问无效的队列。我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

您引用的代码尝试打开并从名为“devQueue”的队列接收消息。如果该代码在多个线程下运行,那么发送到每个线程的消息将部分取决于消息的处理速度以及您要连接的MQ版本。

但是,你在问题中提到了订阅者(你引用的代码声明了一个主题以及队列)。您是否在应用程序的其他位置创建主题订阅,然后使用此代码接收发送到该订阅的消息?如果是这样,那么您的“队列接收”线程可能只是打开一个与持有订阅消息的队列不同的队列。如何创建初始订阅?