2008-11-06 152 views
1

我已经使用Apache.NMS和Apcahe.NMS.ActiveMQ(版本1.0)库编写了Windows服务。该服务使用来自供应商服务器的来自ActiveMQ的消息。ActiveMQ .net客户端锁定

服务旋转起来的连接,并为消息侦听(I处理在onMessage事件)

的连接是一个事务处理的连接,所以我调用每个消息之后提交。

当服务启动时,一切正常,一段时间后会有效。但是,运行一段时间后,它将不再使用消息。即使我重置服务。它通常需要重新启动我的服务和供应商服务器(tomcat)来重新开始。供应商坚持认为他们没有任何问题。

任何一方(客户端或服务器)都不会引发异常 - 它只是“卡住”。

我应该考虑使用Spring.Messaging.Nms吗?

回答

3

我发现了这个问题。在建立连接和消息监听器之后,服务进入一个使用Thread.Sleep(500)的循环。哑。我重构了服务以在OnStart中启动一切,并将其置于OnStop中。

既然这样做,一切都运行完美。

键盘和椅子之间出现经典的ID-10-T错误。

0

我们刚刚遇到了使用.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); 
} 
1

我的代码有点不同。我没有在循环中进行轮询,而是设置了一个响应“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.; 
}