ActiveMq NMS在大约30秒后断开
试图用ActiveMq做简单的pub/sub。我可以很好地工作,但约30秒后用户断开连接。我找了一个超时类型的值,我可以改变,但似乎没有任何工作。这里是用户:ActiveMq NMS在大约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)
任何想法?
当然我在问题发布后几分钟就知道了。以下是其他人寻找的答案:
问题是NMS正在使用OpenWire,而OpenWire在默认情况下有30秒的超时时间。您可以在\ conf \ ActiveMq.xml文件中更改它。以下是您需要更改的内容:
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?wireFormat.maxInactivityDuration=0"/>
</transportConnectors>
wireFormat.maxInactivityDuration参数是关键。
警告! 看来,如果你设置maxInactivityDuration=0
那么套接字永远不会死亡。 即使您在IConnection
上调用Close
和Dispose
,底层连接和它所运行的线程仍然保留。 根据您的实现,这可能意味着内存泄漏。
不知道这是否是一个答案或更多的问题(或两个)的,
但在我们的NMS使用,我们指定wireFormat.MaxInactivityDuration = -1在连接URL客户端 。
似乎有同样的效果,但我们应该使用“-1”或“0”...... ?? 不知道,有什么区别...
另外,有趣的是,不知何故,我们不指定任何东西在服务器配置,但我们所有的JAVA应用程序连接似乎保持连接无论是(因为JAVA客户端使用不同的默认对于OpenWire config.params或smtng?)
好吧,我发现“-1”与“0”相同 http://activemq.apache.org/configuring-wire-formats.html – 2010-06-03 11:15:40
听起来就像您使用的是旧版本的NMS,请尝试更新到最新版本(1.5.5),并且此问题应该消失。有几个与故障转移和不活动监视器相关的问题已在最近的几个版本中得到解决。最新版本已经过硬化。
Tim Fusesource.com
好的。现在我必须像这样实现它,因为知道有泄漏的可能性。还没有找到更好的方法。 – Kelly 2010-08-11 23:31:59