2010-01-15 7 views
2

J'essaie de faire un pub/sub simple avec ActiveMq. Je peux tout faire fonctionner correctement, mais l'abonné se déconnecte après environ 30 secondes. J'ai cherché un type de valeur de délai d'attente que je peux changer mais rien ne semble fonctionner. Voici l'abonné:ActiveMq NMS Déconnecte après environ 30 secondes

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); 
     } 
    } 
} 

J'ai essayé ceci:

connection.RequestTimeout = TimeSpan.MaxValue; 

Mais il ne semble pas changer quoi que ce soit.

Pour résoudre le problème, exécutez le programme et attendez environ 30 secondes. Vous pouvez voir la connexion disparaître dans la console ActiveMQ (http://localhost:8161/admin/connections.jsp par défaut)

Des idées?

Répondre

1

Bien sûr, je me débrouille quelques minutes après avoir posté la question. Voici la réponse pour tous ceux qui cherchent:

Le problème est que NMS utilise OpenWire, et OpenWire par défaut a un délai de 30 secondes. Vous pouvez le modifier dans le fichier \ conf \ ActiveMq.xml. Voici ce que vous devez changer:

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

Ce paramètre wireFormat.maxInactivityDuration est la clé.

1

AVERTISSEMENT! Il semble que si vous définissez maxInactivityDuration=0, le socket ne meurt jamais. Même si vous appelez Close et Dispose sur votre IConnection, la connexion sous-jacente et le thread sur lequel il s'exécute restent encore. Selon votre implémentation, cela pourrait entraîner une fuite de mémoire.

+0

Bonne prise. Pour l'instant j'ai dû le mettre en œuvre comme ça en sachant qu'il y a un risque de fuite. Je n'ai toujours pas trouvé de meilleur moyen. – Kelly

0

Je ne sais pas si elle est une réponse ou plus d'une question (ou deux;),

mais dans notre utilisation NMS, nous précisons wireFormat.MaxInactivityDuration = -1 sur le côté client dans l'URL de connexion.

Semble avoir le même effet, mais devrions-nous utiliser "-1" ou "0" ... ?? Wonder, quelle est la différence ...

En outre, il est intéressant, en quelque sorte on ne précise rien sur config serveur, mais toutes nos connexions d'applications JAVA semble rester conneccted quel que soit (est-ce parce que le client Java utilise un défaut différent pour OpenWire config.params ou smtng?)

+0

ok, j'ai découvert que "-1" est le même que "0" http://activemq.apache.org/configuring-wire-formats.html –

1

On dirait que vous utilisez une ancienne version de NMS, essayez de mettre à jour vers la dernière version (1.5.5) et ce problème devrait disparaître. Plusieurs problèmes liés au moniteur de basculement et d'inactivité ont tous été résolus dans les dernières versions. La dernière version est bien durcie.

Tim Fusesource.com

Questions connexes