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 を生成するように指示する方法はありますか?