1

所以,最近我开始学习骆驼。作为该过程的一部分,我决定浏览所有示例(在此处列出,当您下载包含所有示例和文档的软件包时可用)并看看我能学到什么。

其中一个示例,使用 Mina 进行负载平衡引起了我的注意,因为它在不同的 JVM 中使用了 Mina,并且它通过循环模拟了负载平衡器。

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

我的第二个问题与代码有关。描述指出,我引用:

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

因此,根据我的阅读,我了解到 MINA 服务器 1(每个示例)从负载均衡器接收报告,对其进行更改,然后将该报告发送回某个不可见的客户端。检查代码后,我看不到客户端 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 版本真的会帮助我。

4

2 回答 2

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 条路由)在同一个骆驼文件中。

我建议您学习如何阅读 Spring DSL,因为它确实值得努力。此外,如果您不熟悉 Spring,您确实需要了解它。依赖注入部分尤为重要。

最后一个建议是给自己买一本 Camel In Action。这确实是开始使用 Camel 的好方法。

如果您需要进一步澄清,请询问。

于 2013-11-04T06:05:24.677 回答
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:如果您编辑帖子以包含此信息,我很乐意将其作为答案。

于 2013-11-05T15:27:36.203 回答