使用 Apache NMS STOMP 连接到 RabbitMQ
Conenct to RabbitMQ using Apache NMS STOMP
我正在尝试使用 STOMP 协议读取和写入消息 into/from Rabbit MQ (3.6.5) 队列。
我正在使用 Apache NMS Stomp (1.5.4) 作为客户端库。
使用 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 Broker 发送的 message-id 字段具有以下值:
"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 以不同方式处理 id 的方法?
- 告诉 Rabbit MQ 生成其他消息 ID 的方法?
我发现了问题。
Apache NMS STOMP 期望 message-id 字段采用特定格式。他们试图将 message-id 的特定部分解析为 Int64 变量。 (似乎是特定于 Apache MQ 的。)
他们在版本 1.7.1 中解决了这个问题,遗憾的是它没有正式发布......看起来这个项目不是很活跃/死了。
错误修复:Apache JIRA
我用最新源代码的构建替换了 nugget 包。
这解决了我的问题。
来源可以在这里找到:SVN repo
我正在尝试使用 STOMP 协议读取和写入消息 into/from Rabbit MQ (3.6.5) 队列。 我正在使用 Apache NMS Stomp (1.5.4) 作为客户端库。
使用 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 Broker 发送的 message-id 字段具有以下值:
"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 以不同方式处理 id 的方法?
- 告诉 Rabbit MQ 生成其他消息 ID 的方法?
我发现了问题。
Apache NMS STOMP 期望 message-id 字段采用特定格式。他们试图将 message-id 的特定部分解析为 Int64 变量。 (似乎是特定于 Apache MQ 的。)
他们在版本 1.7.1 中解决了这个问题,遗憾的是它没有正式发布......看起来这个项目不是很活跃/死了。
错误修复:Apache JIRA
我用最新源代码的构建替换了 nugget 包。 这解决了我的问题。
来源可以在这里找到:SVN repo