基本的Apache Camel LoadBalancer故障转移示例

时间:2013-11-02 19:12:01

标签: java ftp apache-camel load-balancing failover

首先,我想让你知道我是Camel的新手,最近我掌握了它的主要概念。

我正在尝试使用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

Bellow是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. 我应该使用哪种骆驼组件?
  5. 如果您能提供有关我的代码以及如何解决问题的任何反馈,我会更感激。

1 个答案:

答案 0 :(得分:1)

经过多方努力,我找到了一种基于apache提供的loadbalancer示例实现此方法的方法。

我已将eclipse项目上传到我的github帐户,你可以在这里查看它:

尽管我的示例确实尊重整体预期的体系结构,但它确实没有什么区别,如下所述:

  • 它使用Spring DSL而不是Java DSL
  • MyApp-A是负载均衡器。每10个它生成一个报告(而不是读取文件)并将其发送给MyApp-B。
  • MyApp-B对应localhost上的MINA服务器1:9991
  • MyApp-C对应于localhost:9993
  • 上的MINA服务器3
  • MyApp-D对应于localhost:9992
  • 上的MINA服务器2
  • 当MyApp-C收到报告时,会将其发送回MyApp-A

此外,还不清楚MyApp-C何时,何地或为何使用更改的报告回复MyApp-A。 Spring DSL代码中没有指定此行为,到目前为止还没有人能够向我解释为什么会发生这种情况。

所以还有两个问题:

  1. 如何使用Java DSL
  2. 完成此操作
  3. 为什么MyApp-C会回复MyApp-A以及它是如何做到的?
  4. 如果您感兴趣,以下是我创建的README.txt,其中包含对问题的准确描述:

      

    使用MINA示例

    进行负载均衡      

    此示例显示了如何轻松使用Camel-MINA组件   设计一个允许容错解决方案的解决方案   在服务器关闭时重定向请求。这些服务器很简单   由Apache MINA框架创建并运行的TCP / IP服务器   单独的JVM。

         

    在此示例中,负载均衡器客户端将每次生成一个报告   10秒钟,然后将该报告发送到运行的MINA服务器   本地主机:9991。然后,该服务器将报告转发给MINA   服务器在localhost:9993上运行,然后返回报告   客户端,以便它可以在控制台上打印。每个MINA服务器都会   更改邮件的正文,以便您可以看到该邮件的路由   报告不得不使用。如果由于某种原因(假设你按下了CTRL + C),   运行在localhost:9991上的MINA服务器已经死了,然后是   loadbalancer将自动开始使用运行的MINA服务器   本地主机:9992。一旦这个MINA服务器收到报告,它就会   将它发送回运行在localhost:9993上的MINA服务器   什么都没发生过。如果localhost:9991再次恢复,那么   负载均衡器将再次开始使用它。

         

    负载均衡器将始终尝试使用localhost:9991   尝试使用localhost:9992无论如何。

         

    运行示例

         

    要在maven仓库中编译和安装项目,请执行   在项目的根目录上执行以下命令

         

    mvn clean install

         

    要运行该示例,请在中执行以下命令   各个文件夹:

         

    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!


    修改

    在上一篇文章中我有两个问题: 1.如何在java dsl中执行此操作 2.为什么mina服务器发送回复。

    我最终会攻击问题1,但我只是想说明问题2的解决方案在这里: http://camel.465427.n5.nabble.com/Load-balancing-using-Mina-example-with-Java-DSL-td5742566.html#a5742585

    向克劳斯先生致谢,以获得答案和建议。


    修改

    现在两个问题都解决了,它们都在同一个git存储库中。我希望我的代码可以帮助人们。