【发布时间】: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,不,他们不是。这只是解释问题的一种简单方法,无需解释庞大的业务背景。