2016-08-12 9 views
0

Ich versuche, Nachrichten in/aus einer Rabbit MQ (3.6.5) Warteschlange mit dem STOMP-Protokoll zu lesen und zu schreiben. Ich verwende Apache NMS Stomp (1.5.4) als Client-Bibliothek.Conenct zu RabbitMQ mit Apache NMS STOMP

Beim Senden einer Nachricht mit NMS bekomme ich die folgende Ausnahme:
Eingabe-Zeichenfolge hatte kein richtiges Format.

Die Gründe dafür sind, dass NMS erwartet, dass das Feld message-id eine Nummer an einer bestimmten Position enthält. Diese
ist der Code von der NMS-Bibliothek:

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); 
} 

Die Nachricht-ID-Feld durch das Kaninchen gesendet MQ Broker den folgenden Wert hat: „T_ID: fig-52033-636066062974737556-1: 0: 1 : 1 @@ session-lOnNy1WnMfOTxEEVQmLHgg @@ 1"
NMS versucht zu konvertieren "1 @@ session-Bo6HXXTZFSh51Qy7X4wx9A @@ 1" zu einem Int64.

Das ist mein Client-Code:

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); 
       } 
      } 
    } 

Gibt es eine Lösung für dieses Problem?

  • Eine Möglichkeit, NMS so zu konfigurieren, dass die ID anders gehandhabt wird?
  • Eine Möglichkeit, Rabbit MQ anzuweisen, andere Nachrichten-IDs zu generieren?

Antwort

1

Ich habe das Problem gefunden.
Apache NMS STOMP erwartet, dass das Nachrichten-ID-Feld in einem bestimmten Format vorliegt. Sie versuchen, einen bestimmten Teil der Nachrichten-ID in eine Int64-Variable zu analysieren. (Scheint Apache MQ spezifisch zu sein.)
Sie behoben dieses Problem in Version 1.7.1, die leider nicht offiziell freigegeben wird ... sieht aus wie das Projekt ist nicht sehr aktiv/tot.

Bugfix: Apache JIRA

Ich ersetzen das Nugget-Paket mit einem Build der neuesten Quelle. Das hat mein Problem behoben. Die Quelle kann hier gefunden werden: SVN repo

Verwandte Themen