ActiveMq NMS отключается примерно через 30 секунд

Я пытаюсь сделать простой 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 по умолчанию)

Есть идеи?


person Kelly    schedule 15.01.2010    source источник


Ответы (4)


Конечно, я понял это всего через несколько минут после публикации вопроса. Вот ответ для тех, кто ищет:

Проблема в том, что NMS использует OpenWire, а OpenWire по умолчанию имеет 30-секундный тайм-аут. Вы можете изменить это в файле \conf\ActiveMq.xml. Вот что вам нужно изменить:

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

Этот параметр wireFormat.maxInactivityDuration является ключевым.

person Kelly    schedule 15.01.2010
comment
Откуда вы узнали, что у OpenWire таймаут 30 секунд? - person Mubashir Koul; 31.05.2018

ВНИМАНИЕ! Похоже, что если вы установите maxInactivityDuration=0, то сокет никогда не умрет. Даже если вы вызываете Close и Dispose на своем IConnection , базовое соединение и поток, в котором оно выполняется, все равно остаются. В зависимости от вашей реализации это может означать утечку памяти.

person Peter Goras    schedule 19.04.2010
comment
Хороший улов. На данный момент мне пришлось реализовать это так, зная, что существует потенциальная утечка. До сих пор не нашел лучшего способа. - person Kelly; 12.08.2010

Похоже, вы используете более старую версию NMS, попробуйте обновить ее до последней версии (1.5.5), и эта проблема должна исчезнуть. Было несколько проблем, связанных с аварийным переключением и монитором бездействия, которые были решены в последних нескольких выпусках. Последняя версия хорошо закалена.

Тим Fusesource.com

person Tim Bish    schedule 06.09.2010

Не уверен, что это ответ или вопрос (или два;),

но при использовании NMS мы указываем wireFormat.MaxInactivityDuration=-1 на стороне клиента в URL-адресе подключения.

Кажется, имеет тот же эффект, но должны ли мы использовать "-1" или "0"... ?? Интересно, а какая разница...

Кроме того, что довольно интересно, мы почему-то ничего не указываем в конфигурации сервера, но все наши подключения к приложениям JAVA, кажется, остаются подключенными независимо (это потому, что клиент JAVA использует другое значение по умолчанию для OpenWire config.params или smtng?)

person Oleg Kiorsak    schedule 03.06.2010
comment
Хорошо, я обнаружил, что -1 совпадает с 0 activemq.apache.org/configuring- wire-formats.html - person Oleg Kiorsak; 03.06.2010