2015-10-02 4 views
0

Я пытаюсь подключиться с моего кода C# к IBM MQ.Несколько слушателей MQ не работают

Обратный звонок работает для одного слушателя (прислушивается к очереди). то есть, когда сообщение приходит в очередь, метод обратного вызова правильно вызывается.

Я создал другую очередь # 2 на том же QueueManager/Channel. Зарегистрировал нового слушателя в этой очереди с помощью другого метода обратного вызова. Во время запуска сервера ошибок не наблюдается.

Когда сообщение поступает в эту очередь # 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 
    } 
+0

Вы видите какие-либо ошибки? Как определяются ваши каналы? Какую версию MQ вы используете? Чтобы использовать MQCB на клиенте V7, вы должны быть подключены к серверу V7, а параметр SHARECNV канала должен иметь ненулевое значение. – ValerieLampkin

+0

Можете ли вы показать нам свой код? – Shashi

+0

Ваши очереди на самом деле не называются queue # 1, а очереди # 2 - они? –

ответ

0

Я не хардкорный C# программист, но я думаю, что проблема из-за static ключевого слова в public static Handler _handler;. Ключевое слово static делает только один экземпляр _ handler доступным для всех экземпляров класса MyListener. Хотя вы создаете двух пользователей и назначаете двух слушателей, второй вызов для назначения слушателя сообщения перезаписывает первый прослушиватель. Следовательно, вы получаете сообщения только из одной очереди.

Я немного изменил ваш код, поскольку он не компилировался и получил его после удаления ключевого слова 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"); 
    } 
} 

}

+0

@Sasi, я попытался удалить статическое ключевое слово, и проблема все еще остается. Я также попытался создать два отдельных класса слушателя, причем onMessage реализован для каждого слушателя, но когда сообщение поступило в эту очередь №2, вызывается обратный вызов, связанный с первой очередью, а не тот, который я зарегистрировал для второй очереди. Я использую MQ-клиент 7.0 и .NET 2012. – ginz

+0

Также можно увидеть, что при выполнении программы вы получаете ниже Exception. System.Exception: Исключение типа 'System.Исключение ". FFDC to xmsffdc9664_2015.10.10T19.51.02.290535.txt Необработанное исключение: IBM.WMQ.Nmqi.NmqiException: было исключено исключение типа «IBM.WMQ.Nmqi.NmqiException». at IBM.WMQ.Nmqi.UnmanagedNmqiMQ.NmqiConsumerMethodUM (Int32 hconn, IntPtr structMqmd, IntPtr structMqgmo, IntPtr buffer, IntPtr structMqcbc) – ginz

+0

@ Valarie, SHARECNV настроен как 1, и я попытался перейти на 2, 5, 10 и т. Д. Но не получилось. – ginz

Смежные вопросы