45、Camel部署策略全解析

Camel部署策略全解析

1. Camel停止与关闭机制

Camel在停止或关闭路由时,会采用优雅关闭机制。例如,在相关示例中,路由会以优雅的方式停止,这样在运行时停止路由时,能可靠地避免丢失正在处理的消息。

stopRoute shutdownRoute 方法有所不同。 shutdownRoute 会从管理(JMX)中注销路由,若想之后再次启动路由,应使用 stopRoute ;只有当需要永久移除路由时,才使用 shutdownRoute

2. Camel部署策略概述

Camel是轻量级且可嵌入的集成框架,支持比传统ESB和应用服务器更多的部署策略和灵活性,可用于从独立Java应用到Web容器再到云的各种运行时环境。常见的部署策略有以下四种:
- 嵌入Java应用
- 在Apache Tomcat的Web环境中运行
- 在JBoss应用服务器内运行
- 在如Apache Karaf的OSGi容器中运行

3. 嵌入Java应用

如果需要与外界通信,将Camel嵌入Java应用是个不错的选择。通过引入Camel,能利用其提供的各种传输、路由和企业集成模式(EIP)等。

在嵌入式模式下,需要将所有必要的Camel和第三方JAR添加到类路径中。由于Camel是用Maven构建的,可使用Maven进行项目开发,借助其依赖管理系统。

以下是一个简单的示例代码,展示如何启动Camel:

public class FileCopierWithCamel {
    public static void main(String args...) throws Exception {
        CamelContext context = new DefaultCamelContext();       
        context.addRoutes(new RouteBuilder() {
            public void configure() {
                from("file:data/inbox").to("file:data/outbox");
            }
        });
        context.start();
        Thread.sleep(10000);
        context.stop();
    } 
}

在应用的整个生命周期内,需要保留对 CamelContext 的引用,以便进行Camel的关闭操作。为避免应用立即关闭,示例代码中使用了 Thread.sleep 方法。在实际应用中,需要采用其他方式让应用持续运行,直到收到关闭请求。

以Rider Auto Parts应用为例,该应用使用Spring XML文件来配置Camel,只需启动Spring即可启动应用。以下是启动Spring的示例代码:

public class InventoryMain {
    public static void main(String[] args) throws Exception {
        String filename = "META-INF/spring/camel-context.xml";
        AbstractXmlApplicationContext spring =
               new ClassPathXmlApplicationContext(filename);
        spring.start();
        Thread.sleep(10000);
        spring.stop();
        spring.destroy();
    } 
}

为解决 main 方法等待应用终止的问题,Camel提供了 Main 类。可以修改 InventoryMain 类来使用这个类:

import org.apache.camel.spring.Main;
public class InventoryMain {
    public static void main(String[] args) throws Exception {
        Main main = new Main();
        main.setApplicationContextUri("META-INF/spring/camel-context.xml");
        main.enableHangupSupport();
        main.start();
    } 
}

通过启用挂起支持,当JVM终止(如按下Ctrl - C组合键)时,Camel会优雅地关闭。也可以通过调用 main 实例的 stop 方法来停止Camel应用。

嵌入Camel到独立Java应用的优缺点如下表所示:
| 优点 | 缺点 |
| — | — |
| 可灵活部署所需内容 | 需要部署所有所需的JAR |
| 可将Camel嵌入任何标准Java应用 | 需要手动管理Camel的生命周期(启动和停止) |
| 适用于胖客户端应用,如Swing或Eclipse富客户端GUI | |

4. 嵌入Web应用

将Camel嵌入Web应用能带来与嵌入Java应用类似的好处。Camel提供了连接到喜欢的Web容器所需的一切。在组织中,可能有现有的基础设施可用于部署Camel应用,在熟悉的环境中部署能获得安装、管理和监控应用的直接支持。

当Camel嵌入Web应用时,需要确保所有JAR都打包在WAR文件中。如果使用Maven,这将自动完成。嵌入Web应用的Camel实例由Spring引导,利用Spring这个广泛使用的框架,让最终用户可以使用熟悉的部署方法,同时将Camel的生命周期与Spring的生命周期管理绑定,确保Camel实例在Web容器中正确启动和停止。

以下是在 web.xml 文件中使用标准Spring上下文监听器来引导Spring和Camel的示例:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="
           http://java.sun.com/xml/ns/javaee
           http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener> 
</web-app>

这个上下文监听器还会在Web应用停止时正确关闭Camel。默认情况下,Spring会从 WEB - INF 文件夹加载名为 applicationContext.xml 的Spring XML文件。以下是在该文件中嵌入Camel的示例:

<?xml version="1.0" encoding="UTF-8"?> 
<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">
    <import resource="camel-cxf.xml"/>                          
    <bean id="inventoryService" class="camelinaction.InventoryService"/>
    <bean id="inventoryRoute" class="camelinaction.InventoryRoute"/>
    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <routeBuilder ref="inventoryRoute"/>
    </camelContext> 
</beans>

可以使用以下Maven命令来运行示例:

mvn jetty:run

若要使用Jetty插件,需在 pom.xml 文件的 <build><plugins> 部分添加以下配置:

<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>maven-jetty-plugin</artifactId>
    <version>7.1.6.v20100715</version> 
</plugin>
5. 部署到Apache Tomcat

要将应用打包为WAR文件,可运行 mvn package 命令,该命令会在 target 目录下创建WAR文件。

启动Apache Tomcat(以Unix系统为例),使用 bin/startup.sh 脚本:

davsclaus:~/apache-tomcat-6.0.26$ bin/startup.sh 
Using CATALINA_BASE:   /Users/davsclaus/apache-tomcat-6.0.26 
Using CATALINA_HOME:   /Users/davsclaus/apache-tomcat-6.0.26 
Using CATALINA_TMPDIR: /Users/davsclaus/apache-tomcat-6.0.26/temp 
Using JRE_HOME:        /System/Library/Frameworks/JavaVM.framework/Versions/1.5/Home
Using CLASSPATH:       /Users/davsclaus/apache-tomcat-6.0.26/bin/bootstrap.jar

启动后,可通过 tail -f logs/catalina.out 查看日志。

将WAR文件复制到Apache Tomcat的 webapps 目录:

cp target/riderautoparts-war-1.0.war ~/apache-tomcat-6.0.26/webapps/

可以使用SoapUI发送Web服务请求来测试部署的应用,需要知道Web服务运行的WSDL的URL,如 http://localhost:9000/inventory?wsdl

这种部署模型的另一个好处是可以直接利用Servlet容器的HTTP端点。在独立Java部署场景中,需要依赖Jetty传输;而在Web部署场景中,容器已经具备套接字管理、线程池、调优和监控等功能,若使用Servlet传输处理入站HTTP端点,Camel可以利用这些功能。

若要使用Apache Tomcat的HTTP入站端点,需要进行以下调整:
- 在 web.xml 文件中添加 CXFServlet

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="
           http://java.sun.com/xml/ns/javaee
           http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>
            org.apache.cxf.transport.servlet.CXFServlet
        </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping> 
</web-app>
  • Maven用户需要在 pom.xml 文件中调整依赖,使用HTTP传输代替Jetty:
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>2.2.11</version> 
</dependency>
  • 调整 camel-cxf.xml 文件:
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:cxf="http://camel.apache.org/schema/cxf"
       xsi:schemaLocation="
         http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://camel.apache.org/schema/cxf
         http://camel.apache.org/schema/cxf/camel-cxf.xsd">
    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
    <import resource=
        "classpath:META-INF/cxf/cxf-servlet.xml"/>                    
    <cxf:cxfEndpoint id="inventoryEndpoint"
        address="/inventory"                       
        serviceClass="camelinaction.inventory.InventoryEndpoint"/> 
</beans>

使用Apache Tomcat后,Web服务的地址变为 http://localhost:8080/context/services/inventory?wsdl

嵌入Camel到Web应用的优缺点如下表所示:
| 优点 | 缺点 |
| — | — |
| 可利用Servlet容器 | 可能在某些Web容器上产生恼人的类加载问题 |
| 让容器管理Camel生命周期 | |
| 受益于Servlet容器的管理和监控功能 | |
| 为运维提供熟悉的运行时平台 | |

6. 嵌入JBoss应用服务器

在JBoss应用服务器(JBoss AS)中部署Camel应用的常见方法是使用前面讨论的Web部署模型。但JBoss AS有麻烦的类加载机制,需要使用特殊的Camel JBoss组件来解决。该组件由于与JBoss AS的LGPL许可证相关的授权问题,未包含在Apache Camel发行版中,可在Camel Extra(http://code.google.com/p/camel - extra/)项目网站获取。

示例基于之前的示例,有两个小改动:
- 将 camel - jboss - 2.5.0.jar 添加到 src/main/webapp/WEB - INF/lib 目录,确保在使用 mvn package 打包应用时包含该JAR。
- 在 applicationContext.xml 文件中添加以下Bean定义,以利用JBoss特定的类加载器:

<bean id="jbossResolver"
      class="org.apache.camel.jboss.JBossPackageScanClassResolver"/>

要将应用部署到JBoss,启动JBoss并将WAR文件复制到 server/default/deploy 目录。例如,在笔记本上启动JBoss AS 5.1的命令如下:

davsclaus:~/jboss$ bin/run.sh 

通过以上几种部署策略,开发者可以根据具体的需求和环境选择最适合的方式来部署Camel应用。不同的部署策略各有优缺点,在实际应用中需要综合考虑各种因素。

Camel部署策略全解析

7. 运行在OSGi容器(以Apache Karaf为例)

除了前面介绍的几种部署方式,Camel还可以运行在OSGi容器中,这里以Apache Karaf为例。OSGi(Open Services Gateway Initiative)提供了一个模块化的运行环境,允许动态地安装、启动、停止和卸载组件。

在Apache Karaf中部署Camel应用,首先需要启动Karaf容器。启动后,可通过Karaf的控制台进行操作。

要在Karaf中安装Camel相关的功能,可使用以下命令:

feature:install camel

这将安装Camel的核心功能。如果需要特定的组件,例如Camel的文件组件,可以使用以下命令:

feature:install camel-file

部署Camel应用时,通常会将应用打包为OSGi bundle。可以使用Maven来构建OSGi bundle,需要在 pom.xml 文件中添加相应的配置,例如使用 maven-bundle-plugin

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>3.3.0</version>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
            <Bundle-Version>${project.version}</Bundle-Version>
            <Import-Package>*</Import-Package>
        </instructions>
    </configuration>
</plugin>

构建完成后,将生成的bundle文件安装到Karaf中:

bundle:install -s mvn:your.group.id/your-artifact-id/your-version

其中 -s 参数表示安装后立即启动该bundle。

运行在OSGi容器中的优缺点如下表所示:
| 优点 | 缺点 |
| — | — |
| 支持动态部署和更新,便于系统的维护和升级 | 学习曲线较陡,需要了解OSGi的相关概念和规范 |
| 提供模块化的架构,提高代码的可复用性和可维护性 | 可能存在依赖管理的复杂性,尤其是多个bundle之间的依赖 |
| 可以利用Karaf的管理和监控功能 | |

8. 不同部署策略的选择建议

在选择Camel的部署策略时,需要综合考虑多个因素,以下是一些选择建议:
- 独立Java应用 :如果应用是一个简单的、独立运行的程序,不需要复杂的容器管理,且对灵活性要求较高,那么嵌入到独立Java应用是一个不错的选择。例如,一些小型的工具类应用或者测试程序。
- Web应用 :当应用需要与Web服务交互,或者需要利用Servlet容器的功能时,嵌入到Web应用是合适的。同时,如果有现有的Web基础设施,在熟悉的环境中部署可以减少运维成本。比如,开发一个基于Web的业务系统,需要处理HTTP请求和响应。
- JBoss应用服务器 :如果企业已经在使用JBoss AS作为应用服务器,并且希望将Camel应用集成到现有的环境中,那么可以选择在JBoss AS中部署。但需要注意解决类加载的问题。
- OSGi容器(如Apache Karaf) :对于需要动态部署和管理组件的大型系统,或者需要实现模块化架构的应用,运行在OSGi容器中是一个很好的选择。例如,开发一个复杂的企业级应用,需要不断地添加和更新功能模块。

9. 总结

Camel作为一个轻量级且可嵌入的集成框架,提供了多种灵活的部署策略,适用于不同的运行时环境和应用场景。从独立Java应用到Web容器,再到应用服务器和OSGi容器,每种部署策略都有其独特的优缺点。

在实际应用中,开发者需要根据项目的需求、现有的基础设施、团队的技术栈等因素来选择最合适的部署策略。同时,了解不同部署策略的技术细节和操作步骤,能够帮助开发者更高效地部署和管理Camel应用。通过合理选择和运用这些部署策略,可以充分发挥Camel的优势,实现高效的集成和数据处理。

以下是一个简单的流程图,展示了选择Camel部署策略的基本思路:

graph TD;
    A[需求分析] --> B{应用类型};
    B -->|独立程序| C[独立Java应用];
    B -->|Web服务交互| D[Web应用];
    B -->|已有JBoss环境| E[JBoss应用服务器];
    B -->|动态模块化需求| F[OSGi容器];

通过以上的介绍和分析,希望能帮助开发者更好地理解和运用Camel的部署策略,为项目的成功实施提供有力的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值