2013-05-08 3 views
1

Я пытаюсь написать простое приложение для отправки сообщений в тему из ввода ввода и отображения сообщений, опубликованных по теме. Есть два исполняемых файла командной строки: один для издателя и другой для подписчика. Когда я публикую сообщения по теме, я могу видеть сообщения, отправленные на эту тему.Не удалось получить сообщения из темы с помощью API EMS.NET

Следующая команда показывает, что есть сообщения по этой теме (см F1.gif): -

show stat EMS.Test.Topic 

enter image description here

Следующая команда показывает, что сообщения становятся потребляемый абонентами (см F2.gif)

show stat consumers topic=EMS.Test.Topic 

enter image description here

Однако я не могу получить сообщения EMS .NET API. Он застревает на Message msg = subscriber.Receive();. Я убедился, что детали подключения и данные аутентификации верны, потому что они используются при публикации сообщений.

public string ReceiveMessagesFromTopic(string topicName) 
     { 
      TopicConnection connection = null; 
      string messageFromPublisher = string.Empty; 
      try 
      { 
       var factory = new TIBCO.EMS.TopicConnectionFactory(serverUrl); 
       connection = factory.CreateTopicConnection(userName, password); 
       TopicSession session = connection.CreateTopicSession(false, Session.AUTO_ACKNOWLEDGE); 
       Topic topic = session.CreateTopic(topicName); 
       TopicSubscriber subscriber = session.CreateSubscriber(topic); 
       connection.Start(); 
       while (true) 
       { 
        Message msg = subscriber.Receive(); 
        if (msg == null) 
        { 
         break; 
        } 
        if (msg is TextMessage) 
        { 
         TextMessage tm = (TextMessage) msg; 
         messageFromPublisher = tm.Text; 
        } 

       } 
       connection.Close(); 
      } 
      catch (EMSException e) 
      { 
       if (connection!=null) 
       { 
        connection.Close(); 
       } 


       throw; 
      } 

      return messageFromPublisher; 
     } 

ответ

1

В моем коде .NET была глупая ошибка. следующий цикл while никогда не возвращается, поэтому возврат невозможен. Мне нужно разбить цикл while, когда я получаю сообщение. Duh !!!!

while (true) 
{ 
     Message msg = subscriber.Receive(); 

     if (msg == null) 
     { 
      break; 
     } 
     if (msg is TextMessage) 
     { 
      TextMessage tm = (TextMessage) msg; 
      messageFromPublisher = tm.Text; 
      break; 
     } 

} 
+0

привет, даже для меня контроль останавливается у подписчика. он не переходит в строку if (msg == null). если в теме нет сообщений, тогда элемент управления не переходит к следующей строке. поэтому интересно, если выше правильное решение ... – user1447718

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