= 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.1 to 3.2

=== JndiRegistry

The deprecated class `org.apache.camel.impl.JndiRegistry` has been removed. The class `org.apache.camel.support.jndi.JndiBeanRepository` located in `org.apache.camel:camel-support` should be used instead.

=== Rest Configuration

The rest configuration has been simplified and there is now a single RestConfiguration instance (https://issues.apache.org/jira/browse/CAMEL-13844[CAMEL-13844]) per Camel Context.

The following methods have been removed:

* org.apache.camel.CamelContext#addRestConfiguration(RestConfiguration restConfiguration)
* org.apache.camel.CamelContext#getRestConfiguration(String component, boolean defaultIfNotFound)
* org.apache.camel.CamelContext#getRestConfigurations

https://issues.apache.org/jira/browse/CAMEL-13844

=== Camel Cloud

The following `ServiceDiscovery` implementation has been removed: 

* org.apache.camel.impl.cloud.CachingServiceDiscovery
* org.apache.camel.impl.cloud.CachingServiceDiscoveryFactory

https://issues.apache.org/jira/browse/CAMEL-14813

=== Camel with Karaf and OSGi

Camel on Apache Karaf / OSGi has been moved to its own project at: https://github.com/apache/camel-karaf

The Maven dependencies has changed the groupid from `org.apache.camel` to `org.apache.camel.karaf`.

For example the `camel-blueprint` would be changed from

[source,xml]
----
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-blueprint</artifactId>
  <version>3.1.0</version>
</dependency>
----

To:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel.karaf</groupId>
  <artifactId>camel-blueprint</artifactId>
  <version>3.2.0</version>
</dependency>
----

The Camel Karaf features are the same as before, you can still install Camel in Karaf shell via:
[source,text]
----
feature:repo-add camel 3.2.0
feature:install camel
----

==== Other components involved

- Camel-test-blueprint

[source,xml]
----
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-test-blueprint</artifactId>
  <version>3.1.0</version>
</dependency>
----

To:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel.karaf</groupId>
  <artifactId>camel-test-blueprint</artifactId>
  <version>3.2.0</version>
</dependency>
----

- Camel-test-karaf

[source,xml]
----
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-test-karaf</artifactId>
  <version>3.1.0</version>
</dependency>
----

To:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel.karaf</groupId>
  <artifactId>camel-test-karaf</artifactId>
  <version>3.2.0</version>
</dependency>
----

- Camel-eventadmin

[source,xml]
----
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-eventadmin</artifactId>
  <version>3.1.0</version>
</dependency>
----

To:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel.karaf</groupId>
  <artifactId>camel-eventadmin</artifactId>
  <version>3.2.0</version>
</dependency>
----

- Camel-kura

[source,xml]
----
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-kura</artifactId>
  <version>3.1.0</version>
</dependency>
----

To:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel.karaf</groupId>
  <artifactId>camel-kura</artifactId>
  <version>3.2.0</version>
</dependency>
----

- Camel-osgi-activator

[source,xml]
----
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-osgi-activator</artifactId>
  <version>3.1.0</version>
</dependency>
----

To:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel.karaf</groupId>
  <artifactId>camel-osgi-activator</artifactId>
  <version>3.2.0</version>
</dependency>
----

- Camel-paxlogging

[source,xml]
----
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-paxlogging</artifactId>
  <version>3.1.0</version>
</dependency>
----

To:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel.karaf</groupId>
  <artifactId>camel-paxlogging</artifactId>
  <version>3.2.0</version>
</dependency>
----

==== Introducing a camel-karaf-bom

We introduce a camel-karaf-bom too, so the end-users should be able to have all of this dependencies easier:

[source,xml]
----
    <dependencyManagement>
        <dependencies>
            <!-- Add Camel BOM -->
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-bom</artifactId>
                <version>${project.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- Add Camel Karaf BOM -->
            <dependency>
                <groupId>org.apache.camel.karaf</groupId>
                <artifactId>camel-karaf-bom</artifactId>
                <version>${camel.karaf.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
----

In this way you'll get both the boms and all the "goodies"

=== camel-elytron

Transitive dependencies from org.wildfly.security:wildfly-elytron were removed.

=== camel-spark-rest

This component has been removed. Use any of the other REST capable components, such as `camel-jetty`, `camel-netty-http`
or `camel-undertow`.

=== EIPs with cacheSize option

The `cacheSize` option on EIPs has been improved to reduce memory usage when the cache is disabled by
setting the value to -1. One of the optimizations is that new endpoints will not be added to the endpoint registry,
but discarded after use. This avoids storing additional endpoints in the cache (memory) as the cache should be disabled (cacheSize=-1).

See more details in the documentation for the `cacheSize` option on the EIPs.

=== Configuring components via Java setters

Configuring Camel components from plain Java code has changed in some components where they were using
delegate setters for a nested configuration class. These delegates has been removed, to ensure configuration
is more consistent and aligned with how endpoints is configured as well, and by using source code generated configurer classes.

The following Camel components has been affected and changed on the component level:

- camel-aws
- camel-aws2
- camel-consul
- camel-etcd
- camel-infinispan
- camel-kafka
- camel-servicenow
- camel-ssh
- camel-stomp
- camel-xmlsecurity
- camel-yammer

This only affects if you are configuring these components using Java code or XML `<bean>` style.

For example

[source,java]
----
KafkaComponent kafka = new KafkaComponent();
kafka.setBrokers("mybroker1:1234,mybroker2:1234");
----

Should now be:

[source,java]
----
KafkaComponent kafka = new KafkaComponent();
kafka.getConfiguration().setBrokers("mybroker1:1234,mybroker2:1234");
----

And in XML:

[source,xml]
----
<bean id="kafka" class="org.apache.camel.component.kafka.KafkaComponent">
  <property name="brokers" value="mybroker1:1234,mybroker2:1234"/>
</bean>
----

Should now be:

[source,xml]
----
<bean id="kafka" class="org.apache.camel.component.kafka.KafkaComponent">
  <property name="configuration">
    <property name="brokers" value="mybroker1:1234,mybroker2:1234"/>
  </property>
</bean>
----

=== Configuring components via Spring Boot auto configuration

Configuring Camel spring boot components has changed its option keys to be flattened and have the `.configuration` prefix
removed now.

Before in application.properties

[source,properties]
----
camel.component.kafka.configuration.brokers=mybroker1:1234,mybroker2:1234
----

Should now be
[source,properties]
----
camel.component.kafka.brokers=mybroker1:1234,mybroker2:1234
----

This applies to all the Camel spring boot _starter_ JARs where basically `.configuration` should be removed.

=== Configuring camel-activemq, camel-amqp and camel-stomp via Spring Boot auto configuration

When configuring these components from spring boot auto-configuration then the URL for the broker was named `broker-u-r-l`
in the spring boot auto configuration support. This has been renamed to `broker-url` and a few other options too.

Before:

[source,properties]
----
camel.component.activemq.broker-u-r-l=tcp://localhost:61616
----

After:

[source,properties]
----
camel.component.activemq.broker-url=tcp://localhost:61616
----

=== camel-any23

The XML DSL has changed for the `<configuration>` element, which now
is flattened so the key/values should be configured on it directly:

Before:
[source,xml]
----
<dataFormats>
  <any23 id="any23" baseURI ="http://mock.foo/bar" outputFormat="TURTLE" >
    <configuration>
      <property key="any23.extraction.metadata.nesting" value="off" />
      <property key="another-key" value="another-value" />
    </configuration>
    <extractors>html-head-title</extractors>
  </any23>
</dataFormats>
----

After:

[source,xml]
----
<dataFormats>
  <any23 id="any23" baseURI ="http://mock.foo/bar" outputFormat="TURTLE" >
    <configuration key="any23.extraction.metadata.nesting" value="off"/>
    <configuration key="another-key" value="another-value"/>
    <extractors>html-head-title</extractors>
  </any23>
</dataFormats>
----

=== camel-avro

The avro component and data format has been split up into two JARs. The dataformat is in `camel-avro` JAR
and the component in `camel-avro-rpc` JAR.

=== camel-infinispan

Camel now requires endpoint URIs to include context-path which means
the endpoint URI `infinispan` should be changed to `infinispan:current`.

=== google-pubnub

The google-pubnub component has been improved to use a new Java library and become faster.

Support for Apache Karaf has been removed.

=== camel-xstream

The XML DSL has changed for the `<converters>`, `<alias>`, `implicitCollections`, and `omitFields` elements,
which now is flattened so the key/values should be configured on it directly.

Before:
[source,xml]
----
<xstream id="xstream-1" mode="NO_REFERENCES"
    permissions="-org.apache.camel.dataformat.xstream.*,org.apache.camel.dataformat.xstream.PurchaseHistory,org.apache.camel.dataformat.xstream.PurchaseOrder">
    <converters>
        <converter class="org.apache.camel.dataformat.xstream.XStreamConfigurationTest$PurchaseOrderConverter" />
    </converters>
    <aliases>
                <alias name="purchase-order" class="org.apache.camel.dataformat.xstream.PurchaseOrder" />
    </aliases>
    <implicitCollections>
       <class name="org.apache.camel.dataformat.xstream.PurchaseHistory">
          <field>history</field>
       </class>
    </implicitCollections>
</xstream>
----

After:
[source,xml]
----
<xstream id="xstream-1" mode="NO_REFERENCES"
    permissions="-org.apache.camel.dataformat.xstream.*,org.apache.camel.dataformat.xstream.PurchaseHistory,org.apache.camel.dataformat.xstream.PurchaseOrder">
    <converters key="purchase-converter" value="org.apache.camel.dataformat.xstream.XStreamConfigurationTest$PurchaseOrderConverter"/>
    <aliases key="purchase-order" value="org.apache.camel.dataformat.xstream.PurchaseOrder"/>
    <implicitCollections key="org.apache.camel.dataformat.xstream.PurchaseHistory" value="history"/>
</xstream>
----

Multiple values for `implicitCollections` and `omitFields` can be separated by comma

For example:
[source,xml]
----
<implicitCollections key="org.apache.camel.dataformat.xstream.PurchaseHistory" value="history,adress"/>
----

=== camel-weather

This component has been upgraded from using Apache Http Client 3.x to 4.x and is therefore not fully backwards compatible.
Some options for configurer and setting proxy is removed. You can however configure this directly on a custom `HttpClient` instance
and set this on the `WeatherComponent` to use.

=== Endpoint URIs without context path

Previously Camel components may work by referring to their name only without a colon and context path (eg `log`)
that for a few components would allow them to create an endpoint anyway.

Now this is not allowed and Camel will throw an `NoSuchEndpointException`.

An endpoint by its logical id can still be referred by the id only, eg
[source,java]
----
Endpoint endpoint = camelContext.getEndpoint("myCoolEndpoint");
----

=== Error handling

The context scope error handling has been modified a bit.  The processors in those `onException` and
`onCompletion` are not shared between routes anymore.  This should have little effect in most cases.
If there is a need to have a single set of processors involved (such as when using a loadbalancer or
other stateful patterns), then an intermediary route needs to be used. The following excerpt:

[source,java]
----
onException(Exception.class).handled(true)
    .loadBalance().roundRobin().id("round")
    .to("mock:error", "mock:error2", "mock:error3");
----

... needs to be rewritten as:

[source,java]
----
onException(Exception.class).handled(true).to("direct:error");

from("direct:error").loadBalance().roundRobin().id("round")
    .to("mock:error", "mock:error2", "mock:error3");
----

=== camel-cluster

The base support for cluster in `org.apache.camel.cluster` has been moved
out of `camel-core-engine` into separate JAR named `camel-cluster`.

=== Configuring milli seconds

NOTE: If upgrading to Camel 3.4 or newer then do NOT do this because Camel 3.4 adds back support for this.

Camel was using a type converter from `String` -> `long` that accepted
a time pattern which allowed to configure long values such as `2s` for 2 seconds, e.g. `2000`.
And more complex such as `8h15m` for 8 hours and 15 minutes.

However as this was implemented as part of `String` -> `long` type conversion
which then adds a little bit of overhead during routing, when converting from String to plain numbers.

To make Camel routing engine as fast as possible this feature has been removed.

For example a timer with a 5 second period

[source,java]
----
from("timer:foo?period=5s")
----

Should now be specified as numeric only:

[source,java]
----
from("timer:foo?period=5000")
----

=== Main in camel-spring

The `org.apache.camel.spring.Main` class has been moved out of `camel-spring` JAR into its own
JAR named `camel-spring-main`.

=== Main in camel-test-blueprint

The `org.apache.camel.test.blueprint.Main` class has been renamed to `org.apache.camel.test.blueprint.Main`
and moved into its own `camel-test-blueprint` JAR.

To use the camel-maven-plugin goal `camel:run` with OSGi plugin, you now need to add the following dependency
to the classpath `org.apache.camel.karaf:camel-blueprint-main`.

=== API changes

==== DefaultComponent

The deprecated method `preProcessUri` has been removed.

==== CamelContext

The method `getEndpoint` now throws `NoSuchEndpointException` directly instead of being wrapped
within an `FailedToResolveEndpoint`.

==== JavaUuidGenerator

The `org.apache.camel.impl.engine.JavaUuidGenerator` class has been removed.
Its a very slow UUID generator and its not recommended to be used.

==== PropertiesComponent

The `org.apache.camel.component.properties.PropertiesFunction` has been moved to `org.apache.camel.spi.PropertiesFunction`
and its now possible to add custom functions on the `org.apache.camel.spi.PropertiesComponent` interface.

====  JMX Connector configuration removed

The JMX Connector configuration in camel-management has been https://issues.apache.org/jira/browse/CAMEL-14811[removed]
in Camel 3.2.0. If you want to support the ability to use JMX with Camel remotely, then
just use the default JVM JMX remote capabilities. For example, use the following (insecure)
JVM settings to be able to manage Camel remotely on localhost, port 9913:

[source]
----
-Dcom.sun.management.jmxremote.port=9913
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=localhost
----

