0

STOMP プロトコルを使用して、Rabbit MQ (3.6.5) キューとの間でメッセージを読み書きしようとしています。クライアント ライブラリとして Apache NMS Stomp (1.5.4) を使用しています。

NMS を使用してメッセージを送信すると、次の例外が発生します:
入力文字列が正しい形式ではありませんでした。

その理由は、NMS がファイルされたメッセージ 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 Broker によって送信されたメッセージ ID フィールドの値は次のとおり です-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 );
                }
            }
    }

この問題の解決策はありますか?

  • ID を別の方法で処理するように NMS を構成する方法はありますか?
  • Rabbit MQ に他のメッセージ ID を生成するように指示する方法はありますか?
4

1 に答える 1

1

問題が見つかりました。
Apache NMS STOMP は、メッセージ ID フィールドが特定の形式であると想定しています。メッセージ ID の特定の部分を Int64 変数に解析しようとします。(Apache MQ 固有のようです。)
彼らはこの問題をバージョン 1.7.1で修正しましたが、残念ながら公式にはリリースされていません…プロジェクトはあまり活発ではないようです。

バグ修正: Apache JIRA

ナゲット パッケージを最新ソースのビルドに置き換えました。これで問題が解決しました。

ソースはここにあります: SVN リポジトリ

于 2016-08-15T09:01:40.137 に答える