ActiveMQ .net客户端锁定
问题描述:
我已经使用Apache.NMS和Apcahe.NMS.ActiveMQ(版本1.0)库编写了Windows服务。该服务使用来自供应商服务器的来自ActiveMQ的消息。ActiveMQ .net客户端锁定
服务旋转起来的连接,并为消息侦听(I处理在onMessage事件)
的连接是一个事务处理的连接,所以我调用每个消息之后提交。
当服务启动时,一切正常,一段时间后会有效。但是,运行一段时间后,它将不再使用消息。即使我重置服务。它通常需要重新启动我的服务和供应商服务器(tomcat)来重新开始。供应商坚持认为他们没有任何问题。
任何一方(客户端或服务器)都不会引发异常 - 它只是“卡住”。
我应该考虑使用Spring.Messaging.Nms吗?
答
我发现了这个问题。在建立连接和消息监听器之后,服务进入一个使用Thread.Sleep(500)的循环。哑。我重构了服务以在OnStart中启动一切,并将其置于OnStop中。
既然这样做,一切都运行完美。
键盘和椅子之间出现经典的ID-10-T错误。
答
我们刚刚遇到了使用.Net服务与ActiveMQ交谈的完全相同的问题,但是在我们交付了大约10-20条消息后,我们锁定了。
已经尝试过,没有弹簧框架,它没有稍微好一些(除非我想象的东西)。
你介意检查这段代码,并让我知道它是否与你自己的相似?
ConnectionFactory connectionFactory = new ConnectionFactory("tcp://activemq:61616");
Connection connection = (Connection)connectionFactory.CreateConnection();
connection.Start();
Session session = (Session)connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
IDestination queue = session.GetQueue("test.queue");
MessageConsumer consumer = (MessageConsumer)session.CreateConsumer(queue);
for (int i = 0; i < 1000; i++)
{
IMessage msg = consumer.Receive();
if (msg != null)
Console.WriteLine((msg as ITextMessage).Text);
}
答
我的代码有点不同。我没有在循环中进行轮询,而是设置了一个响应“OnMessage”事件的侦听器。我的代码与下面的代码类似。我的实际代码有很多不相关的东西,但精神是一样的 - 希望这有助于。
factory = new Apache.NMS.ActiveMQ.ConnectionFactory("tcp://activemq:61616");
connection = factory.QueueConnection(factory, "MyQueue", AcknowledgementMode.AutoAcknowledge)
consumer = connection.Session.CreateConsumer(connection.Queue, "2 > 1"); //Get every msg
consumer.Listener += new MessageListener(OnMessage);
private void OnMessage(IMessage message)
{
//Process message here.;
}