Java 基本Apache Camel负载平衡器故障切换示例

Java 基本Apache Camel负载平衡器故障切换示例,java,ftp,apache-camel,load-balancing,failover,Java,Ftp,Apache Camel,Load Balancing,Failover,首先,我只想让你们知道我是骆驼队的新手,最近我掌握了骆驼队的主要概念 我试图创建一个基本的工作示例,使用ApacheCamel和ActiveMQ作为代理,并使用jms组件作为使用故障转移构造的负载平衡器的客户端。所有这些都只使用JavaDSL来完成(如果可能的话) 该示例由4个主要应用程序组成,分别称为MyApp-A、MyApp-B、MyApp-C和MyApp-D。在正常情况下,MyApp-A从我的计算机读取文件,然后将其转换为消息。然后它将该消息发送到MyApp-B,MyApp-B将其发送到M

首先,我只想让你们知道我是骆驼队的新手,最近我掌握了骆驼队的主要概念

我试图创建一个基本的工作示例,使用ApacheCamel和ActiveMQ作为代理,并使用jms组件作为使用故障转移构造的负载平衡器的客户端。所有这些都只使用JavaDSL来完成(如果可能的话)

该示例由4个主要应用程序组成,分别称为MyApp-A、MyApp-B、MyApp-C和MyApp-D。在正常情况下,MyApp-A从我的计算机读取文件,然后将其转换为消息。然后它将该消息发送到MyApp-B,MyApp-B将其发送到MyApp-C

然而,有一个失败的场景。在这种情况下,MyApp-A无法将消息发送到MyApp-B。然后,它将消息发送到MyApp-D,而MyApp-D又将消息发送到MyApp-C

下面是MyApp-A的my代码

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();
    }
}
我曾考虑过使用,但它不会起作用,因为MyApp-C不会知道MyApp-B已经死亡,也不会知道它必须从MyApp-D获取数据

现在我有几个问题:

  • 我如何将消息(在本例中为文件)从MyApp-a发送到不同应用程序的MyApp-B?我应该在JavaDSL的
    .to(String)
    方法中实际添加什么
  • 我该如何编写MyApp-B?我如何让它从a(可能是不同的应用程序,在不同的机器中)接收消息并发送到MyApp-C(我假设如果我知道如何从MyApp-a发送到MyApp-B,我将知道如何从MyApp-B发送到MyApp-C)
  • MyApp-A将如何检测MyApp-B失败
  • 我应该使用哪个camel组件
    如果您能就我的代码以及如何解决问题提供任何反馈,我将不胜感激。

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

    我已将eclipse项目上载到我的github帐户,您可以在此处检查它是否正常工作:

    尽管我的示例确实尊重整体预期架构,但正如下面所解释的,它确实没有什么区别:

    • 它使用SpringDSL而不是JavaDSL
    • MyApp-A是负载均衡器。每10次,它生成一份报告(而不是读取文件),并将其发送到MyApp-B
    • MyApp-B对应于本地主机9991上的MINA服务器1
    • MyApp-C对应于本地主机9993上的MINA服务器3
    • MyApp-D对应于本地主机9992上的MINA服务器2
    • MyApp-C收到报告后,会将其发送回MyApp-A
    此外,还不清楚MyApp-C何时、何地或为什么会用更改后的报告回复MyApp-A。SpringDSL代码中没有指定这种行为,到目前为止,没有人能够向我解释为什么会发生这种情况

    因此,仍然存在两个问题:

  • 如何使用JavaDSL实现这一点
  • 为什么MyApp-C会回复MyApp-A,它是如何回复的
  • 如果您感兴趣,以下是我创建的README.txt,其中准确描述了问题:

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

    在本例中,负载平衡器客户端将每隔一天生成一个报告 10秒,然后将该报告发送到在上运行的MINA服务器 本地主机:9991。然后,该服务器将报告转发给MINA 运行在localhost:9993上的服务器,然后将报告返回给 客户端,以便它可以在控制台上打印。每个MINA服务器将 更改消息的正文,以便可以看到 报告必须使用。如果出于某种原因(假设您按下了CTRL+C), 运行在localhost:9991上的MINA服务器已停止运行,然后 loadbalancer将使用在上运行的MINA服务器自动启动 本地主机:9992。一旦此MINA服务器收到报告,它将 将其发送回运行在localhost:9993上的MINA服务器 什么也没发生过。如果localhost:9991再次恢复,则 loadbalancer将再次开始使用它

    负载平衡器将始终尝试在之前使用localhost:9991 无论发生什么情况,都尝试使用localhost:9992

    运行示例 要在maven repo中编译和安装项目,请执行 在项目根目录上执行以下命令

    mvn清洁安装

    要运行该示例,请在 各自的文件夹:

    mina1:
    mvn exec:java-Pmina1

    mina2: mvn exec:java-Pmina2

    mina3: mvn exec:java-Pmina3

    负载平衡: mvn exec:java-Ploadbalancer

    如果您遇到任何问题,请在骆驼论坛上告知我们


    佩德罗·马丁斯


    编辑

    在上一篇文章中,我有两个问题: 1.如何在JavaDSL中做到这一点 2.为什么mina服务器发送回复

    我最终将讨论问题1,但我只想说明问题2的解决方案如下:

    感谢克劳斯先生的回答和建议


    编辑

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