2017-03-02 114 views
0
  • 我使用apache駱駝來接收隊列中的所有消息。但我需要提到運行駱駝上下文的線程睡眠時間。
  • 現在的問題是它只消費一些消息,即。在 指定的睡眠時間內。
  • 如果我增加睡眠時間,那麼它會路由所有消息,但它會等待,直到完成休眠時間才能終止程序。
  • 我需要的是,駱駝應該路由隊列中的所有消息 ,然後它應該立即終止。

有什麼辦法可以在不指定線程休眠時間的情況下使用java DSL來運行駱駝?使用apache camel接收來自activemq的消息java DSL

示例代碼:

import javax.jms.ConnectionFactory; 

import org.apache.activemq.ActiveMQConnection; 
import org.apache.activemq.ActiveMQConnectionFactory; 
import org.apache.camel.CamelContext; 
import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.component.jms.JmsComponent; 
import org.apache.camel.impl.DefaultCamelContext; 

public class SplitJson { 

    public static void main(String[] args) { 

     try { 
      CamelContext context = new DefaultCamelContext(); 
      ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "admin", 
        ActiveMQConnection.DEFAULT_BROKER_URL); 
      context.addComponent("test-jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory)); 
      context.addRoutes(new RouteBuilder() { 
       public void configure() { 
        from("test-jms:queue:testMQDestination") 
        .choice() 
        .when().jsonpath("$.[?(@.Status == 'YetToStart')]") 
        .to("test-jms:queue:YetToStart") 
        .when().jsonpath("$.[?(@.Status == 'Started')]]") 
        .to("test-jms:queue:Started") 
        .when().jsonpath("$.[?(@.Status == 'Completed')]]") 
        .to("test-jms:queue:Completed") 
        .otherwise() 
        .to("test-jms:queue:Others") 
        .end(); 
       } 
      }); 
      context.start(); 
      Thread.sleep(10000); 
      context.stop(); 
      System.out.println("Done"); 
     } catch (Exception e) { 

      e.printStackTrace(); 
     } 

    } 

} 
+0

爲什麼不使用destinationInterceptors http://activemq.apache.org/virtual-destinations.html或http://activemq.apache.org/broker-camel-component.html在代理端?您可以在使用destinationInterceptors時編輯配置,而無需在使用此插件時重新啓動代理http://activemq.apache.org/runtime-configuration.html –

+0

您不需要進入睡眠狀態。你只需要確保CamelContext永遠運行。 http://camel.apache.org/running-camel-standalone-and-have-it-keep-running.html –

+0

@SoucianceEqdamRashti但路由中的所有消息的執行需要終止 –

回答

2

你需要建立自己的邏輯來檢查出來的時候駱駝空閒並沒有更多的消息是在該隊列。

您可以使用路由策略,然後在onExchangeDone中重置一個時鐘,這是發生新消息時的事件。然後如果在X週期之後沒有新消息,那麼時鐘達到超時或某事然後您知道停止JVM。

這張票:https://issues.apache.org/jira/browse/CAMEL-10596是類似於能夠在X秒後自動停止,消息或空閒X時間。所以它會在駝峯2.19之後出現。

+0

感謝您的答覆.. –

+0

能否請你報價到底是好主意,檢查使用QueueBrowser爲每一定時間隊列的大小,或者是有什麼更好的方式來做到這一點? –

+1

QueueBrowser不好,因爲它會加載所有消息,並且在代理端也可能很難進行限制。對於ActiveMQ,它最好使用JMX/Jolokia或諮詢消息查詢代理,後者可以在JMS回覆消息中返回隊列深度詳細信息。 –