3

'正在尝试使用 ActiveMq 进行简单的发布/订阅。我可以让它一切正常,但订阅者在大约 30 秒后断开连接。我一直在寻找可以更改的超时类型值,但似乎没有任何效果。这是订户:

using System;
using Apache.NMS;
using Apache.NMS.ActiveMQ;
using Apache.NMS.ActiveMQ.Commands;

namespace ActiveMQCatcher
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/");

            using (IConnection connection = factory.CreateConnection())
            {
                connection.ClientId = "MYID";
                connection.Start();

                using (ISession session = connection.CreateSession())
                {
                    IMessageConsumer consumer = session.CreateConsumer(new ActiveMQTopic("MYTOPIC"), null, false);
                    consumer.Listener += consumer_Listener;

                    Console.ReadLine();
                }

                connection.Stop();
            }
        }

        private static void consumer_Listener(IMessage message)
        {
            Console.WriteLine("Got: " + ((ITextMessage) message).Text);
        }
    }
}

我试过这个:

connection.RequestTimeout = TimeSpan.MaxValue;

但这似乎并没有改变什么。

要解决问题,只需运行程序并等待大约 30 秒。您可以在 ActiveMQ 控制台中看到连接消失(默认为http://localhost:8161/admin/connections.jsp )

有任何想法吗?

4

4 回答 4

2

当然,我在发布问题后几分钟就弄清楚了。这是其他人的答案:

问题是 NMS 使用的是 OpenWire,而 OpenWire 默认有 30 秒的超时。您可以在 \conf\ActiveMq.xml 文件中更改它。以下是您需要更改的内容:

<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?wireFormat.maxInactivityDuration=0"/>
</transportConnectors>

那个 wireFormat.maxInactivityDuration 参数是关键。

于 2010-01-15T17:14:09.293 回答
2

警告! 看来,如果你设置,maxInactivityDuration=0那么套接字永远不会死。即使您调用Closeand DisposeIConnection底层连接和它正在运行的线程仍然存在。根据您的实现,这可能意味着内存泄漏。

于 2010-04-19T07:50:31.900 回答
1

听起来您使用的是旧版本的 NMS,尝试更新到最新版本(1.5.5),这个问题应该会消失。在过去的几个版本中,有几个与故障转移和不活动监视器相关的问题都已解决。最新版本已经很好地强化了。

Tim Fusesource.com

于 2010-09-06T21:18:14.517 回答
0

不确定这是一个答案还是一个更多的问题(或两个;),

但是在我们的 NMS 使用中,我们在客户端的连接 url 中指定了wireFormat.MaxInactivityDuration=-1。

似乎有同样的效果,但我们应该使用“-1”还是“0”......??想知道有什么区别...

此外,有趣的是,不知何故,我们没有在服务器配置上指定任何内容,但我们所有的 JAVA 应用程序连接似乎都保持连接(是因为 JAVA 客户端对 OpenWire config.params 或 smtng 使用了不同的默认值吗?)

于 2010-06-03T10:58:45.290 回答