Apache Camel 3.x升级指南(持续更新中)

年初的时候写过一篇有关Camel 3.x 的介绍。 Camel 3.0 在经历了4个里程碑发布之后,很快就会发布正式版了。 这是社区的有关Camel 3.0 RC1发布的讨论。 我想现在困扰大家最大的问题就是Camel 3.0 带来哪些变化呢?如果要从Camel 2.x 升级到 Camel 3.x需要注意哪些事情呢? 其实社区开发者一直在更新一份叫做升级指南的文档,里面记录了Camel 3.x的最新修改。 下面我会结合我的理解把重要的内容展现给大家。

JDK支持

Camel 3 开始支持 Java 11, Camel 3 的早期版本还会继续支持Java 8, 但在后续的版本中会根据社区的发展会不再支持Java 8。

Camel-Core模块化

为了更好支持模块化,在Camel 3中, 将原有的camel-core模块分离成了以下12个子模块

  • camel-api
  • camel-base
  • camel-caffeine-lrucache
  • camel-cloud
  • camel-core
  • camel-jaxp
  • camel-main
  • camel-management-api
  • camel-management-impl
  • camel-support
  • camel-util
  • camel-util-json

使用Maven的用户仍然可以通过采用原有的 camel-core的依赖自动获取以上模块的依赖, 当然你可以通过添加子模块的来减少系统对不必要的class的依赖。 同时我们也将其他在camel-core模块中的组件移出到其他的独立的模块:

  • camel-attachments
  • camel-bean
  • camel-browse
  • camel-controlbus
  • camel-dataformat
  • camel-dataset
  • camel-direct
  • camel-directvm
  • camel-file
  • camel-language
  • camel-log
  • camel-mock
  • camel-properties
  • camel-ref
  • camel-rest
  • camel-saga
  • camel-scheduler
  • camel-seda
  • camel-stub
  • camel-timer
  • camel-validator
  • camel-vm
  • camel-xpath
  • camel-xslt
  • camel-zip-deflater

CamelContext的变化

  • Camel 3.x 只支持一个应用一个的CamelContext设置,不在像Camel 2.x支持多个CamelContext设置。 这样在 @EndpointInject, @Produce, @Consume 里面的 context属性都被去除掉了

  • Camel 3.x 的有关全局属性的设置进行了修改, getProperties 已经修改为 getGlobalOptions

  • Camel 3.x 对 JMX支持模块进行了调整,可以通过添加 camel-management-impl依赖的同时,采用以下代码获取ManagedCamelContext。

    ManagedCamelContext managed =
       camelContext.getExtension(ManagedCamelContext.class);
    
  • CamelContext 中的API也做了一些简化,主要是提供与最终用户相关的API的支持。一些高阶使用场景例如SPI,与组件开发相关的API都被放在了 ExtendedCamelContext 中,大家可以通过adapt的方式获取

    ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
    
  • 与目录(Catalog)相关的API都被移动到了这个新加的 CatalogCamelContext 接口中,大家可以通过下面的方式获取相关的实例

    CatalogCamelContext ccc = context.adapt(CatalogCamelContext.class);
    
  • 为了保持命名的一致性ModelCamelContext 中的 loadRouteDefinitions 修改为 addRouteDefinitionsloadRestDefinitions修改为 addRestDefinitions。 大家可以通过ModelHelper这个工具类来找到对应的load方法。

应用代码迁移修改

XML DSL修改

  • <setHeader> 中的 headerName 修改为 name
  • <setProperty> 中的 propertyName 修改为 name
  • <aggregate> 中的有关完成情况判断的表达式添加了 Expression 的后缀来避免命名冲突, completionSize 修改为 completionSizeExpressioncompletionTimeout 修改为 completionTimeoutExpression
  • 在自定义负载均衡模式的<custom> 修改为<customLoadBalance>
  • <secureXML> 与XML Security 相关的秘钥参数定义属性由 keyOrTrustStoreParametersId 修改为 keyOrTrustStoreParametersRef
  • Zip数据格式定义由 <zipFile> 修改为<zipfile>

删除的组件

  • camel-jibx组件 因为不支持JDK8 而被移除
  • camel-boon 因为不能再支持JDK9及以后的版本而被移除
  • camel-jetty 不在提供producer功能, 可以使用camel-http组件(原名 camel-http4)来发送HTTP请求
  • camel-zookeeper 中的 route policy功能已经删除, 请使用ZookeeperClusterService 或者 camel-zookeeper-master 组件
  • camel-twitter 中的 twitter-streaming 组件因为Twitter的Stream API已经废弃所以删除。

重命名的组件

以往Camel为了支持多个版本的第三方组件, 在组件名后还加入的版本号, 在Camel3中对这些新版本的组件进行了重命名,将组件名中的版本号去掉,以替换原有的老版本组件。

  • camel-test 组件重命名为 camel-dataset-test, 并且从camel-core 移到 camel-dateset 模块中。
  • camel-http4 组件重命名为camel-http组件, 支持http以及https两种协议。
  • camel-hdfs2 组件重命名为camel-hdfs组件, 支持hdfs 协议。
  • camel-mina2 组件重命名为camel-mina组件, 支持mina协议。
  • camel-mongodb3 组件重命名为camel-mongodb, 支持的消息为mongodb。
  • camel-netty4 组件重命名为 camel-netty,支持的协议为netty。
  • camel-netty4-http 组件重命名为 camel-netty-http, 支持协议为netty-http。
  • camel-rxjava2 组件重命名为 camel-rxjava。
  • camel-jetty9 组件重命名为 camel-jetty, 支持协议为jetty。