2010-10-27 5 views
2

j'ai rencontré problème lors de l'utilisation ReceiveNoWait avec Apache.NMS & ActiveMQ, des scénarios très simples:ReceiveNoWait ne fonctionne pas avec Apache.NMS & ActiveMQ

private static void Send(string text) 
{ 
    var factory = new ConnectionFactory("tcp://localhost:61616/"); 
    using (var connection = factory.CreateConnection()) 
    { 
     connection.Start(); 

     var session = connection.CreateSession(); 
     var queue = session.GetQueue("test"); 
     var producer = session.CreateProducer(queue); 

     producer.Send(producer.CreateTextMessage(text)); 
    } 
} 

private static string Receive() 
{ 
    var factory = new ConnectionFactory("tcp://localhost:61616/"); 
    using (var connection = factory.CreateConnection()) 
    { 
     connection.Start(); 

     var session = connection.CreateSession(); 
     var queue = session.GetQueue("test"); 
     var consumer = session.CreateConsumer(queue); 

     var message = (ITextMessage)consumer.ReceiveNoWait(); 
     return message == null ? null : message.Text; 
    } 
} 

static void Main(string[] args) 
{ 
    for (var i = 0; i < 100; i++) 
    { 
     Send(i.ToString()); 
    } 

    while (true) 
    { 
     Console.WriteLine(Receive() ?? "(null)"); 
    } 
} 

Explication: J'ai envoyé 100 messages texte à la file d'attente et je vais recevoir & imprimer les messages un par un avec une boucle while. Mais le code ci-dessus toujours imprimer (null) - Je peux trouver les messages dans la file d'attente de la console d'administration.

Qu'est-ce qui ne va pas?

+0

Avez-vous trouvé une réponse à cette question? J'ai le même problème. –

Répondre

0

Combien de temps attendez-vous l'arrivée des messages? Quelle version des bibliothèques NMS utilisez-vous? Avez-vous essayé d'ajouter un petit retard dans la boucle finale afin que le thread principal ne mette pas le CPU?

Cordialement Tim.

http://fusesource.com

+0

J'ai ajouté un délai de 0,5 seconde après chaque appel Receive mais toujours obtenir le même résultat. J'utilise la dernière version 1.4.x d'Apache.NMS et Apache.NMS.ActiveMQ. –

+0

Je vous recommande de créer un test NUnit qui reproduit le problème et ouvre un nouveau problème sur le Jira ActiveMQ.NET. Ou au moins prendre la question aux listes de diffusion ActiveMQ. –

0

Cette méthode ne fonctionne pas correctement aussi dans la version Apache.NMS.ActiveMQ1.6.2. La solution consiste à utiliser une méthode équivalente IMessage Receive(TimeSpan timeout);:

var message = (ITextMessage)consumer.Receive(TimeSpan.Zero); 

Il est bon d'ajouter un peu de délai d'attente court: TimeSpan.FromMilliseconds(100) devrait fonctionner.

Questions connexes