Подключитесь к RabbitMQ с помощью Apache NMS STOMP

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

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

Это связано с тем, что NMS ожидает, что идентификатор зарегистрированного сообщения будет содержать число в определенной позиции.
Это код из библиотеки 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: fig-52033-636066062974737556-1: 0: 1: 1 @@ session-lOnNy1WnMfOTxEEVQmLHgg @@ 1"
NMS пытается преобразовать "1@@session-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 для обработки идентификатора по-другому?
  • Способ сказать Rabbit MQ генерировать другие идентификаторы сообщений?

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам