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的部署策略,为项目的成功实施提供有力的支持。
超级会员免费看

888

被折叠的 条评论
为什么被折叠?



