我在使用带有Apache.NMS&的ReceiveNoWait时遇到了问题。 ActiveMQ,非常简单的场景:
private static void Send(string text)
{
var factory = new ConnectionFactory("tcp://localhost:61616/");
using (var connection = factory.CreateConnection())
{
connection.Start();
var session = connection.CreateSession();
var queue = session.GetQueue("test");
var producer = session.CreateProducer(queue);
producer.Send(producer.CreateTextMessage(text));
}
}
private static string Receive()
{
var factory = new ConnectionFactory("tcp://localhost:61616/");
using (var connection = factory.CreateConnection())
{
connection.Start();
var session = connection.CreateSession();
var queue = session.GetQueue("test");
var consumer = session.CreateConsumer(queue);
var message = (ITextMessage)consumer.ReceiveNoWait();
return message == null ? null : message.Text;
}
}
static void Main(string[] args)
{
for (var i = 0; i < 100; i++)
{
Send(i.ToString());
}
while (true)
{
Console.WriteLine(Receive() ?? "(null)");
}
}
说明:我向队列发送了100条短信,我将收到&amp;使用while循环逐个打印消息。但上面的代码总是打印(null)
- 我可以从管理控制台中找到队列中的消息。
怎么了?
答案 0 :(得分:1)
此方法在Apache.NMS.ActiveMQ
版本1.6.2
中也无法正常运行。解决方法是使用等效方法IMessage Receive(TimeSpan timeout);
:
var message = (ITextMessage)consumer.Receive( TimeSpan.Zero );
添加一些短暂的超时是很好的:TimeSpan.FromMilliseconds( 100 )
应该有用。
答案 1 :(得分:0)
答案 2 :(得分:0)
您正在创建使用者,然后直接调用receiveNoWait()
。问题在于,当您创建使用者时,消息将异步发送到该使用者。因此,在这里,您正在致电receiveNoWait()
,直到收到任何消息给使用者(即使它们可能存在于服务器上)
解决方案是让使用者一直打开,或者在创建使用者之后等待一段时间,或者使用receive(timeout)