我的实验应用程序非常简单,尝试使用Actors和Akka可以完成的任务。
在JVM启动之后,它会创建具有几个普通参与者,JMS使用者(akka.camel.Consumer)和JMS生成器(akka.camel.Producer)的actor系统。它在actor和JMS生成器之间发送了几条消息 - > JMS服务器 - > JMS消费者。它基本上通过JMS服务与自己对话。
我不时会遇到奇怪的行为:似乎不时,首先应该发送到JMS服务器的消息以某种方式丢失。通过查看我的应用程序日志,我可以看到应用程序正在尝试发送消息,但它从未被JMS服务器接收过。 (对于每次运行,我必须再次启动JVM和应用程序)。
Akka Camel Documentation提到某些组件可能在开始时未完全初始化:“某些Camel组件可能需要一段时间才能启动,在某些情况下,您可能想知道何时使用端点激活并准备好使用。“
我尝试实现以下等待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 actor 确保所有内容都已正确初始化?
这就是我应该做的,还是应该做些什么呢?文档不是很干净,并且测试不容易,因为问题只是偶尔发生......
答案 0 :(得分:1)
在发送任何消息之前,您需要初始化camel JMS组件和Producer。
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());