2016-08-12 10 views
0

Я пытаюсь читать и записывать сообщения в/из очереди MQ (3.6.5) с использованием протокола STOMP. Я использую Apache NMS Stomp (1.5.4) в качестве клиентской библиотеки.Conenct to RabbitMQ с использованием Apache NMS STOMP

При отправке сообщения с использованием NMS я получаю следующее исключение:
Строка ввода не была в правильном формате.

Причины этого в том, что NMS ожидает, что поданный message-id содержит номер в определенной позиции.
Это код из библиотеки NMS:

public void SetValue(String messageKey) 
{ 
    key = messageKey; 

    // Parse off the sequenceId 
    var p = messageKey.LastIndexOf(":"); 
    if (p >= 0) 
    { 
     ProducerSequenceId = Int64.Parse(messageKey.Substring(p + 1)); 
     messageKey = messageKey.Substring(0, p); 
    } 
    ProducerId = new ProducerId(messageKey); 
} 

В поле Идентификатор сообщения посылается Rabbit MQ-Брокер имеет следующее значение: «T_ID: рис-52033-636066062974737556-1: 0: 1 : 1 @@ сеанс lOnNy1WnMfOTxEEVQmLHgg @@ 1"
NMS пытается преобразовать "1 @@ сеанс Bo6HXXTZFSh51Qy7X4wx9A @@ 1" к Int64.

Это мой код клиента:

var connecturi = new Uri("stomp:tcp://localhost:61613?transport.useInactivityMonitor=false&trace=true"); 

Console.WriteLine("About to connect to " + connecturi); 
IConnectionFactory factory = new NMSConnectionFactory(connecturi); 

using (var connection = factory.CreateConnection("XXXX", "XXXX")) 
    using (var session = connection.CreateSession()) 
    { 
     connection.Start(); 

     var destination = SessionUtil.GetDestination(session, "queue://FOO.BAR"); 
     Console.WriteLine("Using destination: " + destination); 

     // Create a consumer and producer 
     using (var consumer = session.CreateConsumer(destination)) 
      using (var producer = session.CreateProducer(destination)) 
      { 
       // Start the connection so that messages will be processed. 
       producer.DeliveryMode = MsgDeliveryMode.Persistent; 

       // Send a message 
       var request = session.CreateTextMessage("Hello World! FROM NMS"); 

       producer.Send(request); 

       // Consume a message 
       var message = consumer.Receive() as ITextMessage; 
       if (message == null) 
       { 
        Console.WriteLine("No message received!"); 
       } 
       else 
       { 
        Console.WriteLine("Received message with ID: " + message.NMSMessageId); 
        Console.WriteLine("Received message with text: " + message.Text); 
       } 
      } 
    } 

Есть ли решение этой проблемы?

  • Способ настройки NMS для обработки идентификатора по-разному?
  • Способ сказать Кролик MQ генерировать другие сообщения-идентификаторы?

ответ

1

Я нашел проблему.
Apache NMS STOMP ожидает, что поле идентификатора сообщения будет в определенном формате. Они пытаются проанализировать определенную часть идентификатора сообщения в переменной Int64. (Кажется, это Apache MQ specific.)
Они исправили эту проблему в версии версии 1.7.1, которая, к сожалению, официально не выпущена ... похоже, что проект не очень активен/мертв.

Исправление: Apache JIRA

я заменил пакет самородок с билда последнего источника. Это исправило мою проблему.

Источник можно найти здесь: SVN repo

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

  • Нет связанных вопросов^_^