Akka Camel - JMS消息丢失 - 应该等待Camel的初始化?

时间:2013-02-18 12:46:11

标签: jms apache-camel akka

我的实验应用程序非常简单,尝试使用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 确保所有内容都已正确初始化?

这就是我应该做的,还是应该做些什么呢?文档不是很干净,并且测试不容易,因为问题只是偶尔发生......

1 个答案:

答案 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());