Apache Camel 3.x Upgrade Guide

This document is for helping you upgrade your Apache Camel application from Camel 3.x to 3.y. For example if you are upgrading Camel 3.0 to 3.2, then you should follow the guides from both 3.0 to 3.1 and 3.1 to 3.2.

Upgrading Camel 3.7 to 3.8

Route startup procedure change

Camel will now initialize all routes during initialization of CamelContext itself. Before all routes where lazy initialized when they were started, which happens in the starting phase of CamelContext. By moving this forward to initialization phase, we ensure all is done together.

This means that all the resources used in the routes such as EIPs, processors, beans, components, data formats, languages etc. are also initialized. An affect of this change is that any custom Camel component that may do initialization logic in the constructors of Consumer or Producer should not do this, but move this logic to doInit or doStart where such logic belongs.

API changes

The following type names are renamed in CamelEvent.Type enum:

  • CamelContextRoutesStarting to RoutesStarting

  • CamelContextRoutesStarted to RoutesStarted

  • CamelContextRoutesStopping to RoutesStopping

  • CamelContextRoutesStopped to RoutesStopped

The method isOnlyDynamicQueryParameters was removed from org.apache.camel.spi.SendDynamicAware and org.apache.camel.support.component.SendDynamicAwareSupport classes.

The class PackageScanResourceResolver has been revisited and the method findResources now returns a collection of org.apache.camel.spi.Resource which provide both the location of the resolved resources and a method to open the related InpuStream:

Collection<Resource> findResources(String location) throws Exception;

OnCompletion EIP

The onCompletion EIP has been fixed. It could trigger multiple completions for a given Exchange before.

Transactions and Multicast, Splitter, or Recipient List EIPs

When using transacted in Camel routes with Multicast, Splitter, or Recipient List EIPs, the exection strackframe could grown deep and this could cause a stack overflow exception. This has been fixed by refactoring the EIP into a special transacted mode and the existing reactive mode.

We do not anticipate any issues but if you are using transactions and these EIPs then we would like to have feedback if you encounter any problems with upgrading.

Configuration changes

The configuration for specifying directory for loading XML routes have been consolidation into a single option (supporting all kinds):

For Spring Boot users:

camel.springboot.xml-routes to camel.springboot.routes-include-pattern camel.springboot.xml-route-templates to camel.springboot.routes-include-pattern camel.springboot.xml-rests to camel.springboot.routes-include-pattern

For Camel Main users:

camel.main.xml-routes to camel.springboot.routes-include-pattern camel.main.xml-route-templates to camel.springboot.routes-include-pattern camel.main.xml-rests to camel.springboot.routes-include-pattern

camel-jackson

In the XML DSL jsonView has been renamed to jsonViewTypeName and made general available in the model and for the lightweight camel-xml-io route parser.

camel-caffeine-lrucache

This LRUCache implementation is using an algorithm where elements that are removed may not be in strict order, and therefore not ideal for LRU caches assuming ordering.

The implementation is not needed anymore in Camel 3, as we are using a simpler default implementation internally. This component was deprecated, and has been removed as Maven dependency in camel-core pom.xml file.

camel-activemq and camel-jms

The JMS and ActiveMQ components now support the optimized toD EIP pattern by using a single endpoint/producer for dynamic destination names.

camel-sjms and camel-sjms2

These two components have been overhauled and re-written with the goal of being more feature complete with the Spring JMS component. They no longer uses their own connection pooling, but let you use the existing 3rd party pooling for ConnectionFactory which is common practice. The components are now reactive and non-blocking, and support the optimized toD EIP pattern by using a single endpoint/producer for dynamic destination names.

Many of the previous features and configuration options have been removed/renamed. The sjms-batch sub component has been removed and is scheduled to be reimplemented in the future. To migrate you need to read their documentation and see what options they now offer.

camel-aws2-sns

The policy option now expects a file, since the policy is going to be complex. It can be from classpath:, http: or file: etc.

camel-aws2-sqs

The policy option now expects a file, since the policy is going to be complex. It can be from classpath:, http: or file: etc.

camel-github

The Camel Github Commit consumer has been changed a bit.

For each exchange now in the body you’ll get the commit full message as a String and not the Commit Object like before.

Other information has been stored in headers declared in GitHubConstants class:

  • GITHUB_COMMIT_AUTHOR - CamelGitHubCommitAuthor - The commit Author

  • GITHUB_COMMIT_COMMITTER - CamelGitHubCommitCommitter - The committer name

  • GITHUB_COMMIT_SHA - CamelGitHubCommitSha - The commit sha

  • GITHUB_COMMIT_URL - CamelGitHubCommitUrl - The commit url

The Camel Github Events consumer has been changed a bit.

For each exchange now in the body you’ll get the event type as a String and not the Event Object like before.

Other information has been stored in headers declared in GitHubConstants class:

  • GITHUB_EVENT_PAYLOAD - CamelGitHubEventPayload - The event payload

camel-infinispan

There are now two components for Infinispan:

  • camel-infinispan to integrate with remote caches through the Hot Rod protocol (scheme: infinispan).

  • camel-infinispan-embedded to integrate with local/embedded caches (scheme: infinispan-embedded).

As consequence of the refactor:

The remote and embedded endpoints provide support the same capabilities, as example queries were only possible on a remote cache and now they are supported on both remote and local/embedded caches. The configuration options for the endpoint are now specific to the context which remove the possibility to mix unrelated properties. Some classes have been relocated (such as indempotent and aggregation repositories) have been moved from org.apache.camel.component.infinispan.processor.* to org.apache.camel.component.infinispan.embedded or org.apache.camel.component.infinispan.remote: - org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository - org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository - org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository - org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository

camel-aws

All the camel-aws components except camel-aws-xray have been deprecated. We suggest migrating to camel-aws2-* components, because in future releases the AWS components will be removed and with the next LTS release (3.10 probably) camel-aws2 components will be renamed to camel-aws.