2013-02-18 2 views
2

Mon application expérimentale est assez simple, en essayant ce qui peut être fait avec Actors et Akka. Après le démarrage de JVM, il crée un système d'acteur avec deux acteurs simples, un consommateur JMS (akka.camel.Consumer) et un producteur JMS (akka.camel.Producer). Il envoie quelques messages entre les acteurs et aussi JMS producteur -> serveur JMS -> consommateur JMS. Il parle essentiellement à lui-même via le service JMS.Akka Camel - Les messages JMS perdus - devraient attendre l'initialisation de Camel?

De temps en temps je éprouvais un comportement étrange: il semblait que de temps en temps, le premier des messages qui étaient censés être envoyés au serveur JMS était en quelque sorte perdu. En regardant mes journaux d'application, j'ai pu voir que les applications essayaient d'envoyer le message mais il n'a jamais été reçu par le serveur JMS. (Pour chaque exécution, je dois redémarrer l'application JVM &).

Akka Camel Documentation mentionne qu'il est possible que certains composants ne peuvent pas être complètement initialisés au début: "Certains composants Camel peuvent prendre un certain temps au démarrage, et dans certains cas, vous voudrez peut-être savoir quand les points de terminaison sont activés et prêts à être utilisé. "

J'ai essayé de mettre en œuvre suite à attendre pour l'initialisation Camel

val system = ActorSystem("actor-system") 
val camel = CamelExtension(system) 

val jmsConsumer = system.actorOf(Props[JMSConsumer]) 
val activationFuture = camel.activationFutureFor(jmsConsumer)(timeout = 10 seconds, executor = system.dispatcher) 
val result = Await.result(activationFuture,10 seconds) 

qui semble aider à ce problème. (Bien que, en supprimant cette étape maintenant, je ne suis plus capable de recréer ce problème ...: /).

Ma question est de savoir si c'est la bonne façon de s'assurer que tous les composants sont entièrement initialisés?

Dois-je utiliser

val future = camel.activationFutureFor(actor)(timeout = 10 seconds, executor = system.dispatcher) 
Await.result(future, 10 seconds) 

pour chaque acteur akka.camel.Producer et akka.camel.Consumer pour être sûr que tout est correctement initialisé?

Est-ce tout ce que je devrais faire, ou quelque chose d'autre devrait être fait aussi bien? La documentation n'est pas claire sur ce point et il n'est pas facile à tester car le problème ne se produisait qu'occasionnellement ...

Répondre

1

Vous devez initialiser le composant JMS de Camel et également le Producer avant d'envoyer des messages.

import static java.util.concurrent.TimeUnit.SECONDS; 

import scala.concurrent.Future; 

import scala.concurrent.duration.Duration; 

import akka.dispatch.OnComplete; 

ActorRef producer = system.actorOf(new Props(SimpleProducer.class), "simpleproducer"); 
Timeout timeout = new Timeout(Duration.create(15, SECONDS)); 

Future<ActorRef> activationFuture = camel.activationFutureFor(producer,timeout, system.dispatcher()); 

activationFuture.onComplete(new OnComplete<ActorRef>() { 
      @Override 
      public void onComplete(Throwable arg0, ActorRef arg1) 
        throws Throwable { 

       producer.tell("First!!"); 
      } 
      },system.dispatcher()); 
+0

Ceci semble confirmer mon approche, juste implémentée en Java. Merci. –