2

私の実験的なアプリケーションは非常に単純で、ActorsとAkkaで何ができるかを試しています。

JVMの起動後、JMSコンシューマー(akka.camel.Consumer)とJMSプロデューサー(akka.camel.Producer)の2つのプレーンアクターを使用してアクターシステムを作成します。アクターとJMSプロデューサー->JMSサーバー->JMSコンシューマーの間でいくつかのメッセージを送信します。基本的に、JMSサービスを介してそれ自体と通信します。

時々、私は奇妙な振る舞いを経験していました。時々、JMSサーバーに送信されるはずの最初のメッセージがどういうわけか失われたように見えました。アプリケーションログを見ると、アプリケーションがメッセージを送信しようとしているのに、JMSサーバーで受信されていないことがわかりました。(実行ごとに、JVMとアプリケーションを再起動する必要があります)。

Akka 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)

これはこの問題に役立つようです。(ただし、この手順を削除すると、この問題を再現できなくなります...:/)。

私の質問は、これがすべてのコンポーネントが完全に初期化されることを保証する正しい方法であるかどうかです。

使用する必要があります

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

各akka.camel.Producerおよびakka.camel.Consumerアクターに対して、すべてが正しく初期化されていることを確認しますか?

私がしなければならないのはそれだけですか、それとも他のこともしなければなりませんか?ドキュメントはそれに関してきれいではなく、問題がたまにしか起こらなかったのでテストするのは簡単ではありません...

4

1 に答える 1

1

メッセージを送信する前に、camel JMS コンポーネントとプロデューサを初期化する必要があります。

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()); 
于 2013-02-27T18:53:28.270 に答える