【问题标题】:ActiveMq NMS Disconnects after about 30 secondsActiveMq NMS 大约 30 秒后断开连接
【发布时间】:2011-01-05 14:33:28
【问题描述】:

正在尝试使用 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

有什么想法吗?

【问题讨论】:

    标签: c# activemq nms


    【解决方案1】:

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

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

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

    wireFormat.maxInactivityDuration 参数是关键。

    【讨论】:

    • 你在哪里发现 OpenWire 有 30 秒超时?
    【解决方案2】:

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

    【讨论】:

    • 好收获。现在我不得不像这样实现它,因为我知道存在泄漏的可能性。还没找到更好的方法。
    【解决方案3】:

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

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

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

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

    【讨论】:

    【解决方案4】:

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

    蒂姆 Fusesource.com

    【讨论】:

      猜你喜欢
      • 2011-01-03
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      相关资源
      最近更新 更多