2015-04-30 6 views
0

Я создаю небольшое приложение для подписки на сообщение из определенной темы. В моей тестовой среде у меня есть только пробная версия WebSphere MQ, и я не знаю, как я могу разместить сообщение в моей определенной теме. Я могу поставить сообщение в очередь и получить его, но когда я хочу получить сообщение из определенной темы, получите пустое сообщение.WebSphere MQ поставил сообщение по теме

Update
Переехал обновление вопрос от другого ответа О.П. в вопрос.

Я использую образец кода C:\Program Files\IBM\WebSphere MQ\Tools\dotnet\samples\cs\base\SimpleSubscribe

// mq properties 
      properties = new Hashtable(); 
      properties.Add(MQC.HOST_NAME_PROPERTY, hostName); 
      properties.Add(MQC.PORT_PROPERTY, port); 
      properties.Add(MQC.CHANNEL_PROPERTY, channelName); 
      #region pass 
      properties.Add(MQC.USER_ID_PROPERTY, "LOGIN"); 
      properties.Add(MQC.PASSWORD_PROPERTY, "PASSWORD"); 
      #endregion 
      properties.Add(MQC.MQCA_TOPIC_NAME, "News.Topic"); 

      if (sslKeyRepository != null) 
      { 
       properties.Add(MQC.SSL_CERT_STORE_PROPERTY, sslKeyRepository); 
      } 
      if (cipherSpec != null) 
      { 
       properties.Add(MQC.SSL_CIPHER_SPEC_PROPERTY, cipherSpec); 
      } 
      if (sslPeerName != null) 
      { 
       properties.Add(MQC.SSL_PEER_NAME_PROPERTY, sslPeerName); 
      } 
      if (keyResetCount != 0) 
      { 
       properties.Add(MQC.SSL_RESET_COUNT_PROPERTY, keyResetCount); 
      } 
      if (sslCertRevocationCheck != false) 
      { 
       MQEnvironment.SSLCertRevocationCheck = sslCertRevocationCheck; 
      } 

      if (transportMode == "managed") 
       properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED); 
      else if (transportMode == "unmanaged") 
       properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_CLIENT); 

      // create connection 
      Console.Write("Connecting to queue manager.. "); 
      queueManager = new MQQueueManager(queueManagerName, properties); 
      Console.WriteLine("done"); 

      // accessing topic 
      Console.Write("Accessing topic " + topicName + ".. "); 
      if (durability == "nondurable") 
       topic = queueManager.AccessTopic(topicName, null, MQC.MQTOPIC_OPEN_AS_SUBSCRIPTION, MQC.MQSO_CREATE | MQC.MQSO_FAIL_IF_QUIESCING); 
      else if (durability == "durable") 
       topic = queueManager.AccessTopic(topicName, null, MQC.MQSO_CREATE | MQC.MQSO_FAIL_IF_QUIESCING | MQC.MQSO_DURABLE | MQC.MQSO_RESUME, null, "DurableSubscriptionName"); 
      Console.WriteLine("done"); 

      // creating a message object 
      message = new MQMessage(); 
      message.WriteString(messageString); 

      int time = 1; 
      // getting messages continuously 
      for (int i = 1; i <= numberOfMsgs; i++) 
      { 
       // creating a message object 
       message = new MQMessage(); 

       try 
       { 
        topic.Get(message); 
        Console.WriteLine("Message " + i + " got = " + message.ReadString(message.MessageLength)); 
        message.ClearMessage(); 
       } 
       catch (MQException mqe) 
       { 
        if (mqe.ReasonCode == 2033) 
        { 
         ++time; 
         --i; 
         Console.WriteLine("No message available"); 
         Thread.Sleep(1000); 
         //waiting for 10sec 
         if (time > 10) 
         { 
          Console.WriteLine("Timeout : No message available"); 
          break; 
         } 
         continue; 
        } 
        else 
        { 
         Console.WriteLine("MQException caught: {0} - {1}", mqe.ReasonCode, mqe.Message); 
        } 
       } 
      } 

      // closing topic 
      Console.Write("Closing topic.. "); 
      topic.Close(); 
      Console.WriteLine("done"); 

      // disconnecting queue manager 
      Console.Write("Disconnecting queue manager.. "); 
      queueManager.Disconnect(); 
      Console.WriteLine("done"); 
+0

Не хватает информации. Используете ли вы WebSphere Application Server или WebSphere MQ? Какие версии? Вы получаете доступ к Java или .net? Прикрепить код. – Gas

+0

Вся информация, которую вы задаете, указана в тегах ... C#, WebSphere MQ version 8.0.0.2 Trial – malymakar

+0

Было бы полезно, если бы вы могли опубликовать код своей подписчика. Используете ли вы Base MQ .NET или XMS .NET API? – Shashi

ответ

2

публикации/подписки методология отличается от сдачи и получения из очередей. Чтобы получить сообщение, опубликованное в теме, приложение-получатель должно иметь подписку на эту тему.

Если вы сначала создаете подписку, а затем получаете от нее сообщения, то при вводе в тему получающее приложение получит копию сообщения.

Я бы повторил просьбу Шаши, разместив код, который у вас есть, поэтому мы можем помочь дальше.

1

Хотя я не вижу проблемы с кодом, за исключением приведенного ниже. Эта строка ни помогает, ни повредит ваше приложение. Константа фактически используется для административного назначения MQ. Вы можете снять его.

properties.Add(MQC.MQCA_TOPIC_NAME, "News.Topic"); 

У вас есть публикация приложения по указанной теме при создании подписки с помощью метода ниже?

topic = queueManager.AccessTopic(topicName,... 

Без публикации на эту тему ваше заявление не будет опубликовано. Ваше приложение должно было исключить исключение MQRC 2033 - MQRC_NO_MESSAGE_AVAILABLE и не возвращать пустое сообщение. Вы не попадаете в это исключение? Когда это исключение будет принято, приложение напечатает «Нет сообщения» на консоли. Вы этого не видите?

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