题
我使用Apache.NMS和Apcahe.NMS.ActiveMQ(版本1.0)库编写了一个Windows服务。该服务使用来自供应商服务器的ActiveMQ消息。
服务旋转连接并侦听消息(我处理OnMessage事件)
连接是事务连接,所以我在每条消息之后调用commit。
当服务启动时,一切都运行良好,并且暂时这样做。但是,在运行一段时间后,它将不再使用消息。即使我重置了服务。它通常需要重新启动我的服务和供应商服务器(tomcat)才能重新开始工作。供应商坚称他们一边都没有错。
任何一方(客户端或服务器)都不会抛出异常 - 它只是“卡住”。
我应该考虑使用Spring.Messaging.Nms吗?
解决方案
我发现了这个问题。在建立连接和消息监听器之后,服务进入与Thread.Sleep(500)的循环。哑。我重构了服务以在OnStart中启动所有内容并将其在OnStop中处理。
因为这样做,一切都运行得很好。
键盘和椅子之间发生经典ID-10-T错误。
其他提示
没关系,我在这里找到了它:
使用ActiveMQ和NMS 交易消息处理
我的代码有点不同。我没有在循环中轮询,而是设置了一个响应“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.;
}
我们刚刚遇到完全相同的问题,使用与ActiveMQ交谈的.Net服务,但是我们只在发送了大约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);
}
不隶属于 StackOverflow