使用Mina和Java DSL的Camel负载平衡示例

时间:2013-11-03 21:50:48

标签: java apache-camel load-balancing failover spring-dsl

所以,最近我开始学习Camel。作为流程的一部分,我决定浏览所有示例(列出HERE,并在DOWNLOAD包含所有示例和文档的时候提供)并查看我可以学习的内容。

其中一个例子Load Balancing using Mina引起了我的注意,因为它在不同的JVM中使用了Mina,它模拟了一个循环的负载均衡器。

这个例子我有一些问题。首先它使用Spring DSL,而不是我的项目使用的Java DSL,我现在发现它更容易理解(主要是因为我已经习惯了)。所以第一个问题:这个例子的版本是否只使用Java DSL而不是Spring DSL用于路由和bean?

我的第二个问题是代码相关。描述说明,我引用:

  

在每十秒钟的演示中,将创建一个Report对象   Camel负载均衡器服务器。此对象由Camel加载发送   平衡器到MINA服务器,然后序列化对象。之一   两个MINA服务器(localhost:9991和localhost:9992)收到   通过设置的字段回复来对象并丰富消息   报告对象。 MINA服务器将回复发送回   客户端,然后在控制台上记录回复。

因此,根据我的阅读,我了解MINA服务器1(每个示例)从loadbalancer接收报告,更改它,然后它将该报告发送回某个不可见的客户端。检查代码后,我看不到客户端java类或XML,当我运行时,服务器只是在命令行上发布结果。客户在哪里?这是什么客户?

此处提供的MINA-1服务器代码:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xsi:schemaLocation="
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
         http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

  <bean id="service" class="org.apache.camel.example.service.Reporting"/>

  <camelContext xmlns="http://camel.apache.org/schema/spring">

    <route id="mina1">
      <from uri="mina:tcp://localhost:9991"/>
      <setHeader headerName="minaServer">
        <constant>localhost:9991</constant>
      </setHeader>
      <bean ref="service" method="updateReport"/>
    </route>

  </camelContext>

</beans>

我不明白updateReport()方法如何在控制台上神奇地打印对象。如果我想向第三个MINA服务器发送消息怎么办?我该怎么办? (我必须添加一个新路由,并将其发送到第三个服务器的URI吗?)

我知道大多数这些问题可能听起来很愚蠢,但如果有人能帮助我,我将不胜感激。这个Java DSL版本对我有用。

2 个答案:

答案 0 :(得分:1)

客户就在这条路上。

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:camel="http://camel.apache.org/schema/spring"
   xsi:schemaLocation="
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

  <bean id="service" class="org.apache.camel.example.service.Generator"/>

  <camelContext xmlns="http://camel.apache.org/schema/spring">

  <route id="sendMessage">
    <from uri="timer://org.apache.camel.example.loadbalancer?period=10s"/>
    <bean ref="service" method="createReport"/>
    <to uri="direct:loadbalance"/>
  </route>

    <!-- use failover load balancer in round robin mode, to automatic failover to next server
         in case of failure -->
  <route id="loadbalancer">
      <from uri="direct:loadbalance"/>
      <loadBalance inheritErrorHandler="false">
        <failover roundRobin="true"/>
        <to uri="mina:tcp://localhost:9991?sync=true"/>
        <to uri="mina:tcp://localhost:9992?sync=true"/>
      </loadBalance>
    <log message="${body}"/>
  </route>
  </camelContext>
</beans>

请注意,有一个时间组件:

<from uri="timer://org.apache.camel.example.loadbalancer?period=10s"/>

该组件调用服务bean的方法createReport,它是类类型:org.apache.camel.example.service.Generator。这是客户。

要添加其他MINA服务器,请使用以下Spring DSL。

 <loadBalance inheritErrorHandler="false">
    <failover roundRobin="true"/>
    <to uri="mina:tcp://localhost:9991?sync=true"/>
    <to uri="mina:tcp://localhost:9992?sync=true"/>
    <to uri="mina:tcp://localhost:9993?sync=true"/>
 </loadBalance>

然后像这样创建第三个MINA消费者:

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:camel="http://camel.apache.org/schema/spring"
   xsi:schemaLocation="
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

  <bean id="service" class="org.apache.camel.example.service.Reporting"/>

  <camelContext xmlns="http://camel.apache.org/schema/spring">

   <route id="mina2">
    <from uri="mina:tcp://localhost:9993"/>
     <setHeader headerName="minaServer">
       <constant>localhost:9993</constant>
     </setHeader>
     <bean ref="service" method="updateReport"/>
    </route>

  </camelContext>

</beans>

请注意,这将要求您在运行示例时另外启动MINA3服务器。客户端和负载均衡器路由(2条路由)位于同一个camel文件中。

我建议您学习如何阅读Spring DSL,因为它确实值得付出努力。如果你不熟悉Spring,你需要一个入门。依赖注入部分尤为重要。

最后一项建议是给自己买一份Camel In Action。这是开始使用Camel的好方法。

如果您需要进一步说明,请随时提出。

答案 1 :(得分:0)

在上一篇文章中我有两个问题: 1.如何添加另一个mina服务器 2.为什么mina服务器发送回复。

Namphibian回答了问题1但没回答问题2.但是,我在这里找到了解决方案: http://camel.465427.n5.nabble.com/Load-balancing-using-Mina-example-with-Java-DSL-td5742566.html#a5742585

向克劳斯先生致谢,给予答案和建议。

PS:如果你编辑你的帖子以包含这些信息,我很乐意选择它作为答案。