1

我使用 Apache.NMS 和 Apcahe.NMS.ActiveMQ(1.0 版)库编写了一个 Windows 服务。该服务使用来自供应商服务器的 ActiveMQ 消息。

该服务启动连接并侦听消息(我处理 OnMessage 事件)

该连接是事务连接,因此我在每条消息后调用 commit。

当服务启动时,一切都运行良好,并且会持续一段时间。但是,它运行一段时间后,将不再消费消息。即使我重置服务。通常需要重新启动我的服务和供应商服务器(tomcat)才能让事情重新开始。供应商坚持认为他们没有任何问题。

任何一方(客户端或服务器)都没有抛出异常 - 它只是“卡住”。

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

4

4 回答 4

3

我发现了这个问题。建立连接和消息侦听器后,服务进入 Thread.Sleep(500) 循环。哑的。我重构了服务以在 OnStart 中启动所有内容并在 OnStop 中处理它。

自从这样做以来,一切都运行良好。

键盘和椅子之间发生经典 ID-10-T 错误。

于 2008-11-14T17:15:20.030 回答
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.;
}
于 2008-11-19T22:54:42.837 回答
1

没关系,我在这里找到了它:

使用 ActiveMQ 和 NMS 进行事务性消息处理

于 2008-11-20T13:30:12.447 回答
0

我们刚刚使用 .Net 服务与 ActiveMQ 交谈时遇到了完全相同的问题,但我们的服务在仅传递大约 10-20 条消息后就锁定了。

已经尝试过使用和不使用 spring 框架,没有它会稍微好一些(除非我在想象事情)。

你介意检查一下这段代码并告诉我它是否与你自己的相似吗?

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);
}
于 2008-11-19T17:37:16.317 回答