2016-10-12

Apache Camel 2.18 Released - Whats included

This week Apache Camel 2.18.0 was released. This release is a significant release which I will highlight in this blog post.


Java 8
Camel 2.18 is the first release that requires Java 1.8 (eg easy to remember Camel 2.18 = Java 1.8. Camel 2.17 = Java 1.7). We have taken a cautious approach and kept the Camel API backwards compatible in the sense as an end user you can take your existing Camel application source code and re-compile them with Java 1.8 and Camel 2.18 and you should be all good.

Internally in the Camel source code we have started using Java 8 APIs for new functionality. Existing functionality is still using Java 7 APIs so we can easily backport bug fixes to the older versions.

We have also gently introduced a few Java 8 lambda/functional APIs into the Java RouteBuilder you can use in predicates and message transformations. You can view a little example at github.

Spring Boot Starters
We had support for Spring Boot since Camel 2.15, but in this release we have curated all the Camel components to align and make them work as first class Spring Boot starter components. This means you should use -starter as your dependencies, such as camel-kafka-starter.

Spring Boot Auto Configuration
All the Camel components now generate Spring Boot auto configuration source code which means you can configure components, data formats, languages etc using Spring Boot configuration. For example in the application.properties file. And on top of that tooling such as IDEA, Eclipse etc which has support for Spring Boot will have code completions when editing the application.properties file.



Nicola Ferraro whom help implement posted a blog entry with more details.

Spring Boot Health Check
Apache Camel comes with health check integrated with Spring Boot if you are using actuators. The health check does a coarse grain check that Camel did start up properly. We plan to implement a deeper Health Check API in Camel to allow individual components to participate in the check. For example to check if the component can connect to a remote system and so on.

WildFly-Swarm Camel
The WildFly Swarm project also has great support for Apache Camel. However this development happens at the wildfly-camel project. WildFly-Camel released version 4.3.0 that supports Camel 2.18.0.

Automatic Documentation
I have previously blogged about that we are working on keeping and generating the Camel documentation from the source code. This means that every Camel component, eip, language, data format etc. all have their options documented in the source code, which we then extract during build and keep the accompanying documentation up to date. We have migrated almost all the documentation from the old wiki system to .adoc files in the source code. We will continue this work to complete this for the next release, and will work on build a new website.

As a Camel developer you may think its not a big deal but really it is. This ensures that all options are always 100% up to date in the documentation. It also allows tooling to access this information at both design and runtime. hawtio can at runtime display deep level information about all your endpoints and include the documentation for each option as shown:


We also have a Maven plugin that can scan all your source code and report invalid configuring Camel endpoints. This plugin is currently hosted at fabric8 where we can foster innovation faster. However when the plugin matures then we plan to donate the source code to Apache Camel project to be included out of the box.

XML XSD fully documented
The XML XSD for Spring and Blueprint now also includes documentation for the configuration you can do outside routes, such as on and other global configurations.

FluentProducerTemplate
One of the smaller but really lovely new additions is the FluentProducerTemplate which is using a fluent style API as a client API for sending a message to a Camel endpoint. Now you can do this nicely with

template().withBody("Hello World).withHeader("foo", 123").withHeader("bar", 456).to("jms:queue:beer").send();

Rest Producer
The Rest component allows to call REST services now (as a client), where you can pick one of the following Camel components for the HTTP transport: http, http4, netty4-http, jetty, restlet, undertow. You can also refer to a existing swagger api doc and include camel-swagger-java on the classpath, for automatic validation of rest endpoint is configured to use a valid rest operation/parameters.

Circuit Break using Hystrix
We added native support for using Netflixx Hystrix as circuit break in your Camel routes. There is an example included.

Below is another example from an example with Spring Boot calling a service running on WildFly Swarm that runs on Kubernetes cluster (or local) which I have been giving talks about recently.

    public void configure() throws Exception {
        from("timer:foo?period=2000")
            .hystrix()
                .to("netty4-http:http://{{service:helloswarm}}/say")
            .onFallback()
                .setBody().constant("Nobody want to talk to me")
            .end()
                .log("${body}");
    }

Zipkin message tracing
The release also includes camel-zipkin which allows to use zipkin for distributed message tracing. You can find more details with the provided example.

ServiceCall
The Service Call EIP allows to call remote services with service discovery from a pluggable service registry. For example you can use etdc, consul, ribbon, kubernetes and others are coming.

New Components
As usual each release comes with a number of new components:

  • camel-asterisk - For interacting with Asterisk PBX Servers
  • camel-cm-sms - For sending SMS messages using SM SMS Gateway.
  • camel-consul - For integrating your application with Consul.
  • camel-ehcache - For interacting with Ehcache 3 cache.
  • camel-flink - Bridges Camel connectors with Apache Flink tasks.
  • camel-lumberjack - For receiving logs over the lumberjack protocol (used by Filebeat for instance)
  • camel-ribbon - To use Netflixx Ribbon with the Service Call EIP.
  • camel-servicenow - For cloud management with ServiceNow.
  • camel-telegram - For messaging with Telegram.
  • camel-zipkin - For tracking Camel message flows/timings using zipkin.
  • camel-chronicle - For interacting with OpenHFT's Chronicle-Engine.
New Data Formats
And we also have a single new data format:
  • camel-johnzon - Apache Johnzon is an implementation of JSR-353 (JavaTM API for JSON Processing).
Important information when upgrading
Older versions of Spring such as 3.x and 4.0.x has been dropped.

OSGi users on ServiceMix/Karaf should also be using Karaf 4.x. However it may work on some older Karaf versions, but its not officially supported. The next release will drop support for older releases for sure.

OSGi users with Spring-DM should install camel-spring-dm module as Spring DM has been removed from camel-spring.

Spring Boot 1.4.x is now required.

You can find more details in the Camel release notes.

What's Next
We will work on a Camel 2.19 release where we can further improve on the trajectory the Camel 2.18 release brings us with the new path on Java 8. We also want to finish migrating the documentation and work on a new website. Hopefully we can also get a nice logo. 

Followed by Camel 2.19, we will get started on Camel 3.x. But this will be discussed in the Camel community first. However for the remainder of this year, we will focus on Camel 2.19 which is planned for start of / Q1 2017.


5 comments:

Souciance Eqdam Rashti said...

Really nice work, and looking forward to 3.0. Thanks for all the hard work.

Eric Cartman said...

Camel readlock strategy in cluster
===================================

Hi Claus,

We are trying to move to cluster with Apache Camel. So far we had it on one node and worked well.

One node: I have readlock strategy set to 'changed' which keeps track of file changes with camelLock file and only when the file has finished downloading, it will be picked up for processing. But camel readlock strategy 'changed' is discouraged in clustering. According to the camel documentation 'idempotent' is recommended.

Two nodes: I have readlock strategy set to 'idempotent' with hazelcast which distributes files to one of the nodes but camel starts processing the file even before the file has finished downloading. We are testing with 5GB files.

Is there a way to stop camel from processing even before file has downloaded when readlock strategy is idempotent?

Thanks.

Eric Cartman said...
This comment has been removed by a blog administrator.
Igor Suhorukov said...

Example based on Apache Camel 2.18:

https://www.linkedin.com/pulse/alarm-system-based-raspberry-pi-3-groovy-apache-camel-igor-suhorukov

Claus Ibsen said...

Eric

Yeah this is currently not possible. I logged a ticket
https://issues.apache.org/jira/browse/CAMEL-10448