2010-01-15 3 views
2

'пытается сделать простой паб/sub с помощью ActiveMq. Я могу заставить все работать нормально, но абонент отключается примерно через 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 по умолчанию)

Любые идеи?

ответ

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 является ключевым.

1

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

+0

Хороший улов. Пока я должен был реализовать его так, зная, что есть потенциал утечки. Все еще не нашли лучшего способа. – Kelly

0

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

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

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

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

+0

ОК, я узнал, что «-1» совпадает с «0» http://activemq.apache.org/configuring-wire-formats.html –

1

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

Tim Fusesource.com

 Смежные вопросы

  • Нет связанных вопросов^_^