2013-11-02 20 views
4

開始我只想讓你知道我是駱駝新手,最近我掌握了它的主要概念。基本的Apache Camel LoadBalancer故障轉移示例

我想創建一個基本的工作示例,使用Apache-Camel和ActiveMQ作爲代理,並使用jms-component作爲使用故障轉移構造的負載均衡器的客戶端。所有這些僅使用Java DSL完成(如果可能的話)。

該示例由4個主要應用程序組成,分別稱爲MyApp-A,MyApp-B,MyApp-C和MyApp-D。在正常情況下,MyApp-A從我的計算機讀取文件,然後將其轉換爲消息。然後它將該消息發送給MyApp-B,MyApp-B將​​其發送給MyApp-C。

enter image description here

然而,有一種失敗的情況。在這種情況下,MyApp-A無法將消息發送到MyApp-B。然後它將消息發送給MyApp-D,然後將它發送給MyApp-C。

enter image description here

貝婁是我的代碼MyApp的-A

public class MyApp-A { 

    public static void main(String args[]) throws Exception { 
     // create CamelContext 
     CamelContext context = new DefaultCamelContext(); 

     // connect to embedded ActiveMQ JMS broker 
     ConnectionFactory connectionFactory = 
      new ActiveMQConnectionFactory("vm://localhost"); 
     context.addComponent("jms", 
      JmsComponent.jmsComponentAutoAcknowledge(connectionFactory)); 

     // add our route to the CamelContext 
     context.addRoutes(new RouteBuilder() { 
      @Override 
      public void configure() { 
       from("file:data/inbox?noop=true")loadbalancer().failover().to("MyApp-B:incomingOrders").to("MyApp-D:incomingOrders").end(); 
      } 
     }); 

     // start the route and let it do its work 
     context.start(); 
     Thread.sleep(10000); 

     // stop the CamelContext 
     context.stop(); 
    } 
} 

我已經使用camel-ftp考慮,但它不會工作,因爲MyApp的-C不知道MyApp的-B死了,並會不知道它必須從MyApp-D獲取。

現在我有幾個問題和疑問:

  1. 我如何發送郵件(在這種情況下,該文件)從MyApp的-A到MyApp的-B這是一個不同的應用程序?我應該怎樣在Java DSL的.to(String)方法中加入?
  2. 我該如何編寫MyApp-B?如何讓它從A(這是一個不同的應用程序,可能位於不同的機器)接收消息並將其發送給MyApp-C(我假設如果我找到了如何從MyApp-A發送到MyApp-B,我會知道如何從MyApp-B發送到MyApp-C)?
  3. MyApp-A如何檢測到MyApp-B失敗?
  4. 我應該使用哪種駱駝組件?

如果你能提供任何有關我的代碼和如何解決問題的反饋,我會更感激。

回答

1

經過很多努力,我找到了一種方法來實現這個基於apache提供的loadbalancer示例。

我已經uploadded Eclipse項目到我的github帳戶,您可以檢查它在這裏工作:

雖然我的例子不尊重整體預期的架構,它確實有一些不同之處如下所示:

  • 它使用Spring DSL而不是Java DSL
  • MyApp-A是負載均衡器。每10個生成一個報告(而不是讀取文件)並將其發送到MyApp-B。
  • MyApp的-B對應於MINA服務器1在localhost:9991
  • MyApp的-C對應於MINA服務器3在localhost:9993
  • MyApp的-d對應於MINA服務器2在localhost:9992
  • 當MyApp的-C收到報告後,將其發送回MyApp-A

此外,還不清楚MyApp-C何時,在何處或爲什麼使用已更改的報告回覆MyApp-A。這種行爲在Spring DSL代碼中沒有指定,到目前爲止沒有人能夠向我解釋爲什麼這種情況甚至發生。

所以兩個問題仍然存在:

  1. 這將如何使用Java DSL
  2. 爲什麼MyApp的-C回覆MyApp的-A,它是如何做,做什麼?

如果你有興趣,這裏是我創建的README.txt,這個問題的準確描述:

負載與MINA例平衡

這個例子顯示,你怎麼能輕鬆使用Camel-MINA組件到 設計一個解決方案,允許在服務器關閉時重定向請求的容錯解決方案。這些服務器很簡單 由Apache MINA框架創建並在 單獨的JVM中運行的TCP/IP服務器。

在這個例子中,負載均衡器客戶端將生成一個報告每 10秒,發送報告,MINA服務器上 本地主機上運行:9991。然後,該服務器將報告轉發到在localhost:9993上運行的MINA 服務器,該服務器然後將報告返回給客戶端 ,以便它可以在控制檯上打印它。每個MINA服務器將 更改消息的正文,以便您可以看到 報告必須使用的路由。如果由於某種原因(可以說你按CTRL + C), 在本地主機:9991上運行的MINA服務器已經死機,那麼 負載均衡器將自動開始使用運行在 localhost:9992上的MINA服務器。一旦MINA服務器收到報告,它就會將 發送回在本地主機上運行的MINA服務器:9993就像 一樣沒有任何事情發生。如果localhost:9991重新恢復,則 負載均衡器將再次開始使用它。

無論如何,負載均衡器將始終嘗試使用localhost:9991,然後 嘗試使用localhost:9992。

運行示例

要編譯並在你的Maven回購安裝項目,該項目

MVN清潔的根用戶身份執行 以下命令來安裝

要運行示例,然後在 個別文件夾中執行以下命令:

mina1:
mvn exec:java -Pmina1

mina2: MVN EXEC:JAVA -Pmina2

mina3: MVN EXEC:JAVA -Pmina3

負載平衡: MVN EXEC:JAVA -Ploadbalancer

如果碰到任何問題,請讓我們知道駱駝論壇
http://camel.apache.org/discussion-forums.html


Pedro Martins!


編輯

在前面的文章中,我有2個問題:1。 爲什麼米娜服務器發送回覆如何做到這一點在Java DSL 2。

我會攻擊問題1最後,但我只是想指出的問題的解決方案2是在這裏: http://camel.465427.n5.nabble.com/Load-balancing-using-Mina-example-with-Java-DSL-td5742566.html#a5742585

榮譽給克勞斯先生的回答和建議。


編輯

現在這兩個問題都解決了,他們都在同一個git倉庫。我希望我的代碼可以幫助人們。