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

Akka Camel-JMS消息丢失-应该等待Camel的初始化吗?,jms,apache-camel,akka,Jms,Apache Camel,Akka,我的实验应用程序非常简单,试着用Actors和Akka做些什么 JVM启动后,它将创建一个包含两个普通参与者的参与者系统:JMS使用者(akka.camel.consumer)和JMS生产者(akka.camel.producer)。它在参与者和JMS生产者->JMS服务器->JMS消费者之间发送两条消息。它基本上是通过JMS服务与自己通信的 有时我会经历一些奇怪的行为:似乎有时,应该发送到JMS服务器的第一条消息不知何故丢失了。通过查看我的应用程序日志,我可以看到应用程序正在尝试发送消息,但J

我的实验应用程序非常简单,试着用Actors和Akka做些什么

JVM启动后,它将创建一个包含两个普通参与者的参与者系统:JMS使用者(akka.camel.consumer)和JMS生产者(akka.camel.producer)。它在参与者和JMS生产者->JMS服务器->JMS消费者之间发送两条消息。它基本上是通过JMS服务与自己通信的

有时我会经历一些奇怪的行为:似乎有时,应该发送到JMS服务器的第一条消息不知何故丢失了。通过查看我的应用程序日志,我可以看到应用程序正在尝试发送消息,但JMS服务器从未收到该消息。(对于每次运行,我必须再次启动JVM和应用程序)

提到一些组件可能在开始时没有完全初始化:“一些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)
这似乎有助于解决这个问题。(尽管现在删除此步骤时,我无法再重新创建此问题…:/)

我的问题是,这是否是确保所有组件完全初始化的正确方法

我应该用吗

对于每个akka.camel.Producer和akka.camel.Consumer参与者,确保所有内容都已正确初始化


这就是我应该做的,还是其他的事情也应该做?文档对此并不清晰,测试也不容易,因为问题只是偶尔发生…

在发送任何消息之前,您需要初始化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()); 
导入静态java.util.concurrent.TimeUnit.SECONDS;
导入scala.concurrent.Future;
导入scala.concurrent.duration.duration;
导入akka.dispatch.OnComplete;
ActorRef producer=system.actorOf(新道具(SimpleProducer.class),“SimpleProducer”);
Timeout Timeout=新超时(Duration.create(15秒));
Future activationFuture=camel.activationFutureFor(producer,timeout,system.dispatcher());
activationFuture.onComplete(新的onComplete(){
@凌驾
未完成的公共无效(可丢弃的arg0、ActorRef arg1)
扔掉的{
制作人。告诉(“第一!!”;
}
},system.dispatcher());

这似乎证实了我刚刚用Java实现的方法。谢谢
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());