2013-02-18 80 views
2

我的實驗性應用程序非常簡單,嘗試使用Actors和Akka可以完成的工作。Akka Camel - JMS消息丟失 - 應等待Camel初始化?

JVM啓動後,它會與普通演員,JMS消費者(akka.camel.Consumer)和JMS生產者(akka.camel.Producer)一起創建actor系統。它在角色和JMS生產者 - > JMS服務器 - > JMS消費者之間發送幾條消息。它基本上通過JMS服務與自己交談。

我時不時遇到奇怪的行爲:似乎時不時,第一個應該發送到JMS服務器的消息不知何故丟失了。通過查看我的應用程序日誌,我可以看到應用程序試圖發送消息,但JMS服務器從未接收到它。 (對於每次運行,我必須再次啓動JVM &應用程序)。

Akka Camel Documentation提到,它可能是一些組件可能不完全初始化在開始時:「一些駱駝的組件可能需要一段時間來啓動,並在某些情況下,當端點被激活,並準備你可能想知道可以使用。

我試圖執行以下操作以等待駱駝初始化

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演員,以確保一切正確初始化?

是所有我應該做的,還是其他什麼東西應該做的呢?文檔不上乾淨的,它不容易測試的問題是發生僅occasionaly ...

回答

1

你需要發送任何消息之前初始化駱駝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()); 
+0

這似乎證實了我的方法,只是在Java中實現。謝謝。 – 2013-03-06 09:04:19