【问题标题】:Multiple MQ listeners not working多个 MQ 侦听器不工作
【发布时间】:2015-10-02 13:41:03
【问题描述】:

我正在尝试从我的 C# 代码连接到 IBM MQ。

回调适用于一个侦听器(侦听队列)。即当消息进入队列时,回调方法被正确调用。

我在同一个 QueueManager / Channel 上创建了另一个队列#2。使用不同的回调方法在此队列上注册了一个新侦听器。服务器启动期间未观察到错误。

当消息到达此队列#2 时,将调用与第一个队列关联的回调,而不是我为该队列注册的回调。我尝试创建不同的会话和不同的连接,但行为仍然相同。

有人有什么想法吗?

class Program
  {
     static void Main(string[] args)
      {
           string env = "DEV"
    string queueName1= "Queue1"
    string queueName2 = "Queue2"

    new MyListener(CallbackHandler1.onMessage1, env, queueName1).RegisterListener();

    new MyListener(CallbackHandler2.onMessage2, env, queueName2).RegisterListener();
         }



  public class MyListener
  {
public delegate void Handler (IMessage msg)
public static Handler _handler

private string env = "";
private string queue = "";

public MyListner(Handler _handler, string environment, string queueName)
{
     _handler = _handler;
      this.env = environment;
      this.queue = queueName
}

public void RegisterListener()
{

    XMSFactoryFactory xff = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);
    IConnectionFactory cf = xff.CreateConnectionFactory();
    cf.SetStringProperty(XMSC.WMQ_HOST_NAME, "10.87.188.156(7111)");
    cf.SetIntProperty(XMSC.WMQ_PORT, 7111);
    cf.SetStringProperty(XMSC.WMQ_CHANNEL, "QMEIGS1.CRM.SVRCONN");
    cf.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT_UNMANAGED);
    cf.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, "QMEIGS1");

    IConnection conn = cf.CreateConnection();
    Console.WriteLine("connection created");
    ISession sess = conn.CreateSession(false, AcknowledgeMode.AutoAcknowledge);
    IDestination dest = sess.CreateQueue(queue);
    IMessageConsumer consumer = sess.CreateConsumer(dest);
    MessageListener ml = new MessageListener(OnMessage);
    consumer.MessageListener = ml;
    conn.Start();
    Console.WriteLine("Consumer started");

}

private void onMessage(IMessage m)
{
    try {
        _handler(m)
        }
    catch (Exception e ) 
    {
    }
}
}


  //callback 1
  public class CallbackHandler1

  public static void onMessage1(IMessage msg)
     {
   ITextMessage textMessage = IMessage(msg)
  // code to perform onmessage1
     }


  //callback 2
  public class CallbackHandler2

     public static void onMessage2(IMessage msg)
     {
  ITextMessage textMessage = IMessage(msg)
  // code to perform onmessage2
     }

【问题讨论】:

  • 您是否看到任何错误?您的渠道是如何定义的?您使用的是哪个版本的 MQ?要在 V7 客户端上使用 MQCB,您必须连接到 V7 服务器,并且通道的 SHARECNV 参数必须具有非零值。
  • 你能告诉我们你的代码吗?
  • 您的队列实际上并没有称为 queue#1 和 queue#2 吗?
  • @Valerie,不,在这个阶段没有错误。第一个侦听器回调获取消息(而我期待第二个获取此消息)。是的,我们的是 v7 实例。我不知道 SHARECNV 参数值的值。会检查并回来。
  • @Morag,不,他们不是。这只是解释问题的一种简单方法,无需解释庞大的业务背景。

标签: c# listener ibm-mq mq


【解决方案1】:

我不是铁杆 c# 程序员,但我认为问题在于 public static Handler _handler; 中的 static 关键字。关键字static 使MyListener 类的所有实例中只有一个_handler 实例可用。尽管您正在创建两个使用者并分配两个侦听器,但分配消息侦听器的第二次调用将覆盖第一个侦听器。因此,您只接收来自一个队列的消息。

我稍微修改了您的代码,因为它没有编译并在删除 static 关键字后让它工作。我使用 MQ v8 来编译程序。但是版本对你来说应该不是问题。

namespace multilistener
{
    class Program
    {
        static void Main(string[] args)
        {
            string env = "DEV";
            string queueName1= "SUB.Q";
            string queueName2 = "SUB.Q1";

        new MyListener(CallbackHandler1.onMessage1, env, queueName1).RegisterListener();

        new MyListener(CallbackHandler2.onMessage2, env, queueName2).RegisterListener();
        System.Threading.Thread.Sleep(30000);
        Console.WriteLine("Program ends");
     }
}

public class MyListener
{
    public delegate void Handler (IMessage msg);
    public Handler _handler; // Remove 'static' keyword

    private string env = "";
    private string queue = "";

    public MyListener(Handler _Inhandler, string environment, string queueName)
    {
        _handler = _Inhandler;
        this.env = environment;
        this.queue = queueName;
    }

    public void RegisterListener()
    {
        try
        {

            XMSFactoryFactory xff = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);
            IConnectionFactory cf = xff.CreateConnectionFactory();
            cf.SetStringProperty(XMSC.WMQ_HOST_NAME, "localhost");
            cf.SetIntProperty(XMSC.WMQ_PORT, 1414);
            cf.SetStringProperty(XMSC.WMQ_CHANNEL, "MY.SVRCONN");
            cf.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT);
            cf.SetStringProperty(XMSC.USERID, "userid");
            cf.SetStringProperty(XMSC.PASSWORD, "password");
            cf.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, "QM1");

            IConnection conn = cf.CreateConnection();
            Console.WriteLine("connection created");
            ISession sess = conn.CreateSession(false, AcknowledgeMode.AutoAcknowledge);
            IDestination dest = sess.CreateQueue(queue);
            IMessageConsumer consumer = sess.CreateConsumer(dest);
            MessageListener ml = new MessageListener(onMessage);
            consumer.MessageListener = ml;
            conn.Start();
            Console.WriteLine("Consumer started");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }

    private void onMessage(IMessage m)
    {
        try {
            _handler(m);
        }
        catch (Exception e ) 
        {
            Console.Write(e);
        }
    }
}


//callback 1
public class CallbackHandler1
{
    public static void onMessage1(IMessage msg)
    {
        ITextMessage textMessage = (ITextMessage)msg;
        // code to perform onmessage1
        Console.WriteLine("First consumer");
    }
}

//callback 2
public class CallbackHandler2
{
    public static void onMessage2(IMessage msg)
    {
        ITextMessage textMessage = (ITextMessage)msg;
        // code to perform onmessage2
        Console.WriteLine("Second consumer");
    }
}

}

【讨论】:

  • @Sasi,我尝试删除 static 关键字,但问题仍然存在。我还尝试创建两个单独的侦听器类,为每个侦听器实现 onMessage,但是当消息到达此队列#2 时,将调用与第一个队列关联的回调,而不是我为第二个队列注册的回调。我正在使用 MQ 客户端 7.0 和 .NET 2012
  • 还可以看到在执行程序时低于异常。 System.Exception:引发了“System.Exception”类型的异常。 FFDC 到 xmsffdc9664_2015.10.10T19.51.02.290535.txt 未处理的异常:IBM.WMQ.Nmqi.NmqiException:引发了“IBM.WMQ.Nmqi.NmqiException”类型的异常。在 IBM.WMQ.Nmqi.UnmanagedNmqiMQ.NmqiConsumerMethodUM(Int32 hconn,IntPtr structMqmd,IntPtr structMqgmo,IntPtr 缓冲区,IntPtr structMqcbc)
  • @Valarie,SHARECNV 配置为 1,我尝试更改为 2、5、10 等。但是没有用。
  • MQ v7.0/7.0.1 已于 2015 年 9 月停止支持。建议您将 MQ 客户端升级到 v7.1 并进行测试。如果问题仍然存在,请向 IBM 开票。
猜你喜欢
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 2012-07-11
  • 2011-01-20
  • 1970-01-01
相关资源
最近更新 更多