'пытается сделать простой pub/sub с 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 по умолчанию)
Любые идеи?
Конечно, я выясню это через несколько минут после публикации вопроса. Вот ответ для любого другого:
Проблема заключается в том, что NMS использует OpenWire, а OpenWire по умолчанию имеет 30-секундный тайм-аут. Вы можете изменить это в файле \conf\ActiveMq.xml. Вот что вам нужно изменить:
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?wireFormat.maxInactivityDuration=0"/>
</transportConnectors>
Этот параметр wireFormat.maxInactivityDuration является ключом.
Похоже, вы используете более старую версию NMS, попробуйте обновиться до последней версии (1.5.5), и эта проблема должна исчезнуть. Было несколько проблем, связанных с монитором отказоустойчивости и бездействия, которые были решены в последних нескольких выпусках. Последняя версия хорошо закалена.
Tim Fusesource.com
Внимание!
Похоже, что если вы установите maxInactivityDuration=0
, то сокет никогда не умрет.
Даже если вы назовете Close
и Dispose
на IConnection
, базовое соединение и поток, который он работает, все еще остаются.
В зависимости от вашей реализации это может означать утечку памяти.
Не уверен, что это ответ или еще один вопрос (или два;),
но в нашем использовании NMS мы указываем wireFormat.MaxInactivityDuration = -1 на стороне клиента в URL-адресе связи.
Кажется, имеет тот же эффект, но мы должны использовать "-1" или "0"...?? Интересно, какая разница...
Кроме того, интересно, как-то мы ничего не указываем в конфигурации сервера, но все наши подключения к JAVA-приложениям, похоже, остаются связанными независимо (это потому, что клиент JAVA использует разные значения по умолчанию для OpenWire config.params или smtng?)