Apache Camel 4.x Upgrade Guide

This document is for helping you upgrade your Apache Camel application from Camel 4.x to 4.y. For example, if you are upgrading Camel 4.0 to 4.2, then you should follow the guides from both 4.0 to 4.1 and 4.1 to 4.2.

Upgrading Camel 4.6 to 4.7

API changes

The class org.apache.camel.impl.engine.ValidatorKey moved to org.apache.camel.spi.ValidatorKey. The class org.apache.camel.impl.engine.TransformerKey moved to org.apache.camel.spi.TransformerKey.

The org.apache.camel.spi.RestRegistry method addRestService has added boolean contractFirst parameter to define if the Rest service is contract-first or code-first.

camel-core

Add default values to ThrottlingExceptionRoutePolicy route policy.

The EndpointRegistry interface has been slightly changed to now directly extends Map<NormalizedEndpointUri, Endpoint> instead of being a parameterized type. This may cause some compilation failures if the code is declaring a variable for the registry.

The statistics collector in the registry has been made immutable. As such, enabling collection of statistics has to be done prior to creating the type converter registry

camel-health

Routes that have been set to not auto-startup are reported as UP in health-checks. We have now implemented similar logic for the consumer health check as well. In this case, the route and consumer health check are linked together.

Previously a route that has not been started due to auto-startup=false would still have its consumer health-check being executed, which could lead to DOWN due to consumer failing the check.

The SupervisingRouteController has now been pre-configured to report DOWN during restart attempts, and also when giving up starting a route. It is the UnhealthyOnExhausted and UnhealthyOnRestarting options that have been changed to be default true. To have previous behavior, you can set these options to false.

camel-cloud

The camel-cloud component has been deprecated.

camel-crypto

PGP dataformat functionality was extracted from camel-crypto JAR and placed into camel-crypto-pgp.

DSL

The WireTap EIP in copy mode, will now do a deep-copy if the message body is of StreamCache type to make access to the message body thread-safe.

The Load Balancer EIP has aligned naming and the following balancers has been renamed in XML and YAML DSL:

Old Name New Name

failOver

failOverLoadBalancer

random

randomLoadBalancer

roundRobin

roundRobinLoadBalancer

sticky

stickyLoadBalancer

topic

topicLoadBalancer

weighted

weightedLoadBalancer

For example in XML, you need to change from:

<route>
  <from uri="direct:start"/>
  <loadBalance>
      <failover>
          <exception>java.io.IOException</exception>
      </failover>
      <to uri="direct:x"/>
      <to uri="direct:y"/>
      <to uri="direct:z"/>
  </loadBalance>
</route>

To:

<route>
  <from uri="direct:start"/>
  <loadBalance>
      <failoverLoadBalancer>
          <exception>java.io.IOException</exception>
      </failoverLoadBalancer>
      <to uri="direct:x"/>
      <to uri="direct:y"/>
      <to uri="direct:z"/>
  </loadBalance>
</route>

camel-file

When using idempotent=true then the file consumer will now run in eager mode, and add the file to the repository before processing, and call confirm when done. Setting idempotentEager=false will use the old behaviour.

camel-jbang

The generate commands has been moved into separate plugin which you need to install first to be able to use.

camel plugin add generate
You can see the list of available plugins using camel plugin get --all.

camel-jetty / camel-servlet / camel-undertow

When using embedded HTTP server (consumer) then the headers CamelHttpServletRequest and CamelHttpServletResponse has been removed.

To gain access to these, then you need to use the HttpMessage API instead as shown below:

ServletRequest request = exchange.getIn().getHeader(Exchange.HTTP_SERVLET_REQUEST, ServletRequest.class);
ServletResponse request = exchange.getIn().getHeader(Exchange.HTTP_SERVLET_RESPONSE, ServletResponse.class);

Should be changed to:

ServletRequest request = exchange.getMessage(HttpMessage.class).getRequest();
ServletResponse response = exchange.getMessage(HttpMessage.class).getResponse();

camel-seda / camel-disruptor

When using InOnly exchange pattern then the producer makes a copy of the message to be added to the queue. Camel will now do a deep-copy if the message body is of StreamCache type to make access to the message body thread-safe.

camel-debug

The debugger (using org.apache.camel.spi.BacklogDebugger) used for tooling such as IDEA and Visual Studio, is fixed to work better out-of-the-box by just having camel-debug JAR or camel-debug-starter (for Spring Boot) on the classpath.

An internal change is that the MBean operation messageHistoryOnBreakpointAsXml on ManagedBacklogDebugger now includes the current node as last message history, which was expected by IDEA tooling, to make it function again.

camel-spring-security

The camel-spring-security component has been updated to improve readiness for Spring Security 7.x. Since Spring Security 5.8 the AccessDecisionManager interface and the related cooperating classes have been deprecated in favor of AuthorizationManager based patterns. If you are creating Spring Security route policies in your code, you must now refactor them to be based on an AuthorizationManager.

For example, you might have a route policy defined as follows:

SpringSecurityAuthorizationPolicy authorizationPolicy = new SpringSecurityAuthorizationPolicy();
authorizationPolicy.setAuthenticationManager(authenticationManager);
authorizationPolicy.setSpringSecurityAccessPolicy(new SpringSecurityAccessPolicy("ROLE_ADMIN"));
authorizationPolicy.setAccessDecisionManager(new AffirmativeBased(Collections.singletonList(new RoleVoter())));

With the changes implemented in this release, that must be refactored to:

SpringSecurityAuthorizationPolicy authorizationPolicy = new SpringSecurityAuthorizationPolicy();
authorizationPolicy.setAuthenticationManager(authenticationManager);
authorizationPolicy.setAuthorizationManager(AuthorityAuthorizationManager.hasRole("ADMIN"));

This new pattern supports a more expressive language to define your own authorization rules, exposing the full power of the Spring Security framework to Camel route policies. See the spring documentation for further details on how to migrate your custom code from AccessDecisionManager to AuthorizationManager.

camel-cloudevents

Moved the camel-cloudevents api into camel-api and removed the camel-cloudevents dependency from all components that provide CloudEvent transformers.

camel-hashicorp-vault

The HashicorpVaultPropertiesFunction from the hashicorp vault has been changed to avoid declaring statically the Vault Engine.

This means the camel.vault.hashicorp.engine property and the support for CAMEL_HASHICORP_VAULT_ENGINE environment variable have been removed.

You can now use the following syntax:

hashicorp:engine:secret

Where engine will be the Hashicorp Vault Engine to be used. This means you’ll be able to use multiple engines at the same time. More details at CAMEL-20775 issue.

camel-test

As part of CAMEL-20785, we have started to rework the CamelTestSupport class. At this point, it should be highly compatible with previous versions, as we are laying down the foundations for greater cleanups in the future. However, several methods have been marked as deprecated. Users of this class are advised to look at the deprecation notices and adjust the code accordingly.

camel-pubnub

Upgraded PubNub client from v6 to v9 and the wherenow operation is removed due to no longer present in the client.

camel-as2

The camel-as2 component has been updated so that the client can compress a MIME body before signing or compress a MIME body before signing and encrypting as described in sections 3.2 and 3.5 of rfc 5402.

When the AS2 server is configured with a decryption key, all received messages require encryption. Otherwise, the server will return an 'insufficient-security' error disposition. Only messages with valid encryption will be successfully processed, for instance, 'encrypted', 'signed-encrypted', 'encrypted-compressed', 'encrypted-compressed-signed' and 'encrypted-signed-compressed' message types.

Messages that cannot be successfully decrypted will return a 'decryption-failed' error disposition. This includes messages encrypted with a invalid key or if the server receives encrypted messages but is not configured with a decryption key.

When the AS2 server is configured with a message signature validation certificate chain, all received messages require a signature. Otherwise, the server will return an 'insufficient-security' error disposition. Only messages with a valid signature will be processed, for instance, 'signed', 'compressed-signed', and 'signed-compressed' message types.

The server will return an 'authentication-failure' error when a message fails signature validation.

When the AS2 server is configured with a message signature validation certificate chain and a decryption key, all received messages require encryption and a signature. Otherwise, the server will return an 'insufficient-security' error disposition. Only messages with a valid signature and encryption will be processed, for instance, 'signed-encrypted', 'encrypted-compressed-signed', and 'encrypted-signed-compressed'.

signing cert

no

yes

no

yes

decryption key

no

no

yes

yes

plain

insufficient-security

insufficient-security

insufficient-security

signed

insufficient-security

insufficient-security

encrypted

decryption-failure

decryption-failure

insufficient-security

signed-encrypted

decryption-failure

decryption-failure

plain-compressed

insufficient-security

insufficient-security

insufficient-security

compressed-signed

insufficient-security

insufficient-security

signed-compressed

insufficient-security

insufficient-security

encrypted-compressed

decryption-failure

decryption-failure

insufficient-security

encrypted-compressed-signed

decryption-failure

decryption-failure

encrypted-signed-compressed

decryption-failure

decryption-failure

Camel Spring Boot

camel-debug-starter

Using camel debugger with Spring Boot is now moved from camel-spring-boot into camel-debug-starter where you can configure the debugger via camel.debug. options in application.properties.

The camel-debug-starter now has camel.debug.enabled=true by default to let the debugger be installed out of the box, by having the JAR on the classpath (as intended). You can turn this off via camel.debug.enabled=false.

Camel Kotlin deprecation

Camel Kotlin DSL is deprecated.