C# 多个MQ侦听器不工作
我正在尝试从我的C#代码连接到IBM MQ 回调适用于一个侦听器(侦听队列)。i、 当消息到达队列时,回调方法被正确调用 我在同一队列管理器/通道上创建了另一个队列#2。使用其他回调方法在此队列上注册了新侦听器。服务器启动期间未观察到任何错误 当消息到达该队列#2时,将调用与第一个队列关联的回调,而不是我为该队列注册的回调。我尝试创建一个不同的会话,以及一个不同的连接,但行为仍然是一样的 有人有什么想法吗C# 多个MQ侦听器不工作,c#,listener,ibm-mq,mq,C#,Listener,Ibm Mq,Mq,我正在尝试从我的C#代码连接到IBM MQ 回调适用于一个侦听器(侦听队列)。i、 当消息到达队列时,回调方法被正确调用 我在同一队列管理器/通道上创建了另一个队列#2。使用其他回调方法在此队列上注册了新侦听器。服务器启动期间未观察到任何错误 当消息到达该队列#2时,将调用与第一个队列关联的回调,而不是我为该队列注册的回调。我尝试创建一个不同的会话,以及一个不同的连接,但行为仍然是一样的 有人有什么想法吗 class Program { static void Main(strin
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
}
我不是一个铁杆的c#程序员,但我认为问题在于publicstatichandler\u处理程序中的static
关键字代码>。关键字static
使得在MyListener
类的所有实例中只有一个
处理程序的实例可用。尽管您正在创建两个使用者并分配两个侦听器,但分配消息侦听器的第二个调用将覆盖第一个侦听器。因此,您只从一个队列接收消息
我对您的代码进行了一些修改,因为它没有编译,在删除static
关键字后,它就可以正常工作了。我使用mqv8编译程序。但是这个版本对你来说应该不是问题
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");
}
}
}您是否看到任何错误?你的频道是如何定义的?您使用的是什么版本的MQ?要在V7客户端上使用MQCB,您必须连接到V7服务器,并且通道的SHARECNV参数必须具有非零值。您可以向我们展示您的代码吗?您的队列实际上不称为队列#1和队列#2吗?@Valerie,不,这一阶段没有错误。第一个侦听器回调获取消息(而我希望第二个侦听器回调获取此消息)。是的,我们的是v7实例。我不知道SHARECNV参数值的值。我会检查后回来的。@Morag,不,他们不是。这只是一种简单的解释问题的方法,没有解释庞大的业务上下文。@Sasi,我尝试删除static关键字,但问题仍然存在。我还尝试创建两个独立的侦听器类,为每个侦听器实现onMessage,但是当消息到达这个队列#2时,会调用与第一个队列关联的回调,而不是我为第二个队列注册的回调。我使用的是MQ client 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 buffer、IntPtr structMqcbc)@Valarie,SHARECNV配置为1,我尝试更改为2、5、10等。。但不起作用。MQ v7.0/7.0.1于2015年9月底停止支持。我建议您将MQ客户端升级到v7.1并进行测试。如果问题仍然存在,请向IBM开具票据。