【问题标题】:Can we have multiple subscribers to same queue in websphere MQ?我们可以有多个订阅者到 websphere MQ 中的同一个队列吗?
【发布时间】:2017-03-16 00:26:09
【问题描述】:

我正在尝试让 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 访问队列,但也不起作用。我错过了什么吗?

【问题讨论】:

  • 请问您正在运行什么版本的 MQ(dspmqver 输出)?
  • @JasonE 8.0 版

标签: c# ibm-mq


【解决方案1】:

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

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

【讨论】:

  • 我正在订阅该主题。我直接订阅队列,我使用的是 MQ 版本 8.0。我正在创建三个单独的任务 (Task.Factory.StartNew),它们将为我的包含引用的 Subscribe() 方法的类提供自己的实例。
  • MQ 中的普通托管订阅将使用系统队列来保存已发布的消息,然后再将它们分派给活动订阅者。此队列的名称将与创建订阅的主题不同。
  • 假设您创建了一个非托管订阅,订阅时将名为“devQueue”的 MQQueue 作为 MQDestination,那么您应该能够使用该 MQQueue 接收消息。订阅时是否使用选项 MQC.MQSO_MANAGED?如果是这样,请尝试删除该选项。默认情况下,MQ 将在向等待的消费者发送消息时使用 LIFO 排序。这是出于性能原因,并且确实意味着您将偏爱一个消费者,直到它无法处理所有传入消息,然后将“溢出”到下一个消费者。这可能就是为什么只有一个线程收到消息的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
相关资源
最近更新 更多