尝试用ActiveMq做简单的pub / sub。我可以完全正常工作,但是用户在大约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)
有什么想法吗?
答案 0 :(得分: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参数是关键。
答案 1 :(得分:2)
警告!强>
看来,如果设置maxInactivityDuration=0
,则套接字永远不会死亡。
即使您在Close
上调用Dispose
和IConnection
,基础连接及其运行的线程仍然存在。
根据您的实现,这可能意味着内存泄漏。
答案 2 :(得分:1)
听起来你正在使用旧版本的NMS,尝试更新到最新版本(1.5.5),这个问题应该消失。有几个与故障转移和非活动监视器相关的问题已在最近几个版本中得到解决。最新版本非常强硬。
添 Fusesource.com
答案 3 :(得分:0)
不确定这是一个答案还是一个问题(或两个;),
但是在我们的NMS使用中,我们指定了wireFormat.MaxInactivityDuration = -1 在连接URL的客户端。
似乎有相同的效果,但我们应该使用“-1”还是“0”......? 不知道,有什么不同......
另外,有趣的是,我们不会在服务器配置上指定任何内容,但我们所有的JAVA应用程序连接似乎都保持连接(是因为JAVA客户端使用不同的OpenWire config.params或smtng默认值?)< / p>