ActiveMq NMS отключается примерно через 30 секунд - PullRequest
3 голосов
/ 15 января 2010

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

Есть идеи?

Ответы [ 4 ]

2 голосов
/ 19 апреля 2010

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

2 голосов
/ 15 января 2010

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

Проблема в том, что 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 голос
/ 07 сентября 2010

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

Тим Fusesource.com

0 голосов
/ 03 июня 2010

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

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

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

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

...