开源Apache Camel简化SOA实施进程
 

2009-10-16 作者:joejoe0332 来源:lupaworld.com

 

在过去的几年中,整合技术得到了突飞猛进的发展。XML/REST/Web 服务/面向服务架构(SOA)的革命不断的促使工程师们和软件公司去创造丰富的协议、适配器、传输器、容器、标准,最佳实践···应有尽有。

无可否认的,现有的这些代码是非常复杂的、多样化的,几乎没有什么它们不可以做到的事情。但这些软件包都是从技术上来建立的,从而使得如何有效的使用其功能成为了读者很大的挑战。

目前,众多读者都完成了这一项挑战。丰富的经验和成千上万的成功案例促进了许多基础架构设计模式定义的形成,从而帮助开发者在整合时能够开门见山,少走弯路。其中,有一套设计模式在业界引起了注意,那就是Hohpe 和 Woolf's企业整合模式。这些模式包含了一些技术上无关的词汇来描述大量整合的解决方案。他们并不是侧重于低层次的编程,而是采取自上而下的方案来开发一个异步的、以信息为基础的架构。

一致的词汇是很好的,而易于使用的框架在实际建立基础架构的时候岂不是更好吗?

这正是Apache的开源Camel项目背后的理念。现在,行之有效的并且真实的一套模式已可以获得了,很明显,下一步就是要去创造一个能够以最简单的方式来实施这个模式的驱动器。

Camel 是一个代码先行的工具,它允许开发者在无须学习厂商定制和复杂的底层技术的情况下进行精密的大规模集成。Camel使用Java领域说明性专用语言来连接信息系统和配置路由和调解规则,在POJO基础上实施企业整合模式。这样,就能使得开发人员不必阅读一页又一页的诸如JMS或JBI之类的技术规范,也不用处理较低级别的Spring框架就可以直接设计和建立面向服务架构(SOA)。

Apache Camel是从Apache其他项目尤其是Apache ActiveMQ 以及Apache ServiceMix的代码和灵感有机的衍生出来的。该项目的成员们发现:人们在许多不同的情况下都想要建立或是使用企业集成模式书中的模式。因此,Camel团队就这样明确的目的开始建立这样的框架。

Camel 概况:

建立Camel的第一步是解偶底层框架中的模式。一些人想要利用企业服务总线(ESB)中的模式,还有一些人则选择Message Broker中的模式,而其他人需要使用应用程序自身的模式或信息提供者间进行对话。仍然有一些人想要在Web服务框架下或是其他沟通平台上使用。比起将此路由代码与特定的Message Broker或企业服务总线(ESB)绑定来说,Camel选择提取此代码作为独立的框架, 这样一来它就能被应用到任何的项目中去。Camel有一个脚本――不管是在Servlet, 或是Web服务包中,全面企业服务总线(ESB),还是信息应用程序中,任何地方都可以做到重新利用。

Camel的最初也是主要的优势在于开发团队无须为了连接系统在容器上下功夫。很多人会认为从容器上下功夫是一个正确的途径,甚至是当成对勇气的考验,但对于越来越多的团队来说这些阻碍成为了不必要的障碍。有了Apache Camel,开发人员就能在完成任务的过程中将无关的任务减少到最低。如果其他要求得到保证的话,Camel还可以在JBI容器中实施,但这并不是必要的。

为了简化编程,Camel还支持特定的Java和XML域语言,使得企业集成模式你那个在所有的Java IDE或Spring XML中使用。这种更高层次的提取能更有效的解决问题。

Camel重新利用了许多Spring 2 的特性,如说明性交易,控制配置倒置,以及众多为了与JMS和JDBC,Java Persistence API (JPA)结合工作的实用层面的东西。这提高了抽取的水平,简化了编程,减少了需要编写的XML,但如果人们要是追根究底花些功夫的话,也会发现其实Camel仍然暴露了线级访问。

Camel示例

我们分别解释不同的方式实现Apache Camel的配置,首先将使用Java DSL(领域特定语言),接下来是Spring XML配置。

Java DSL 配置

如下的列子就是实现了当你想在一个目录结构中从JMS对列里得到信息。首先,我们需要创建一个CamelContext对象:

CamelContext context = new DefaultCamelContext();

这里远不止一种方法向CamelContext添加组件。你也可以在我们创建好路由之后再添加组件,正如一下示例所示: 

context.addRoutes(new RouteBuilder() {
  public void configure() {
  from("test-jms:queue:test.queue").to("file://test");
  // set up a listener on the file component
  from("file://test").process(new Processor() {
  public void process(Exchange e) {
  System.out.println("Received exchange: " + e.getIn());
  }
  });
  }
  });

或者明确的加入JMS组件,如下所示:  

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
  // note we can explicity name the component
  context.addComponent("test-jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));

下次你必须要启动Camel context。如果你使用Spring去配置Camel context这将会为你实现自动化过程,如果你是使用纯Java的话那就必须用先调用start()的方法:

camelContext.start();

这将启动所有的配置路由规则。

当我们完全启动CamelContext后我们可以输入一些对象至Camel。

在通常的使用中,更多的情况往往是通过一些功能组件,外部系统将一些信息或是事件直接输入到Camel中,但是在这里我们将使用CamelTemplate,这也是一个最简单的方法用以测试之前的配置是否正确。

CamelTemplate template = new CamelTemplate(context);

这时我们可以使用CamelTemplate通过JMS发送一些测试消息:  

for (int i = 0; i < 10; i++) {
  template.sendBody("test-jms:queue:test.queue", "Test Message: " + i);
  }

我们从CamelTemplate中发送对象(此时通常为文本对象)纳入CamelContext中并提供给测试组件:jms:queue:test.queue。这些文本对象会自动修改进JMS信息中,并在JMS对列中以test.queue张贴出来。当我们创建好路线我们配置好FileComponent去接收test.queue。 

FileComponent文件将从对列中提取信息并保存在一个名为test的目录中。每一条信息都会存放在一个与其目的地或是信息ID相对应的文件中。

最后,我们配置自己的listener并从FileComponent获得通知,以文本的形式打印出来。

Spring XML配置

这个示例将使用Spring XML配置实现文件的转换,利用XQuery从目录中将结果发送至JMS 对列。它从目录中选取文件进行解析,然后使用XQuery进行转换,再发送至消息对列。当然,为了更清楚的看到生成文件,我们也会有一些别的方法去从JMS对列中选取内容再写到一个输出目录中。

运行示例

让我们用Camel Maven插件来运行这段示例。举例来说,通过开源软件的源代码版或可执行版即可实现以下操作:  

cd examples/camel-example-spring-xquery
  mvn camel:run

你现在应该可以看到在target/outputFiles目录下所生成的文件内容,这就是从JMS对列中所读出的转化信息。 

代码走查

需要做的是用那些定义在类下的 META-INF/spring/camelContext.xml文件正常启动Spring应用。这是应用Camel的XML配置进行配置CamelContext的规范Spring XML文档。

请务必注意这段XML示例文件底部,我们明确的配置了ActiveMQ组件以及关于如何连接代理的详细内容。

关键的Spring XML代码内容如下所示:

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

   <!-- lets parse files, transform them with XQuery and send them to JMS -->
   <route>
     <from uri="file:src/data?noop=true"/>
     <to uri="xquery:myTransform.xquery"/>
     <to uri="jms:MyQueue"/>
   </route>

   <!-- now lets write messages from the queue to a directory -->
   <route>
     <from uri="jms:MyQueue"/>
     <to uri="file:target/outputFiles"/>
   </route>

</camelContext>

<!-- lets configure the default ActiveMQ broker URL -->
<bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
   <property name="connectionFactory">
     <bean class="org.apache.activemq.ActiveMQConnectionFactory">
       <property name="brokerURL" value="vm://localhost?broker.persistent=false"/>
     </bean>
   </property>
</bean> 

希望这篇文章能够让你真正认识到使用Apache Camel来实现企业应用整合是一件多么实际的事。 


火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织