<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5283832592516522895</id><updated>2023-05-21T10:44:40.556+02:00</updated><category term="camel"/><category term="apache camel"/><category term="roadmap"/><category term="fuse"/><category term="release"/><category term="conference"/><category term="video"/><category term="camel in action"/><category term="speaker"/><category term="open source"/><category term="webinar"/><category term="fabric8"/><category term="hawtio"/><category term="presentation"/><category term="book"/><category term="kubernetes"/><category term="community"/><category term="camelone"/><category term="activemq"/><category term="fabric"/><category term="tooling"/><category term="red hat"/><category term="ease of use"/><category term="fusesource"/><category term="jboss"/><category term="jboss fuse"/><category term="tutorial"/><category term="birthday"/><category term="camelk"/><category term="discount"/><category term="eip"/><category term="meetup"/><category term="openshift"/><category term="event"/><category term="manning"/><category term="review"/><category term="servicemix"/><category term="IDEA"/><category term="blog"/><category term="devnation"/><category term="esb"/><category term="example"/><category term="interview"/><category term="plugin"/><category term="apache"/><category term="docker"/><category term="documentation"/><category term="jmx"/><category term="knative"/><category term="microservices"/><category term="screencast"/><category term="xPaaS"/><category term="camel alternative"/><category term="caps"/><category term="cxf"/><category term="dsl"/><category term="dzone"/><category term="enterprise"/><category term="management"/><category term="mule"/><category term="real life"/><category term="ref card"/><category term="websphere"/><category term="akka"/><category term="article"/><category term="cloud"/><category term="eclipse"/><category term="hl7"/><category term="iPaaS"/><category term="java"/><category term="meap"/><category term="metallica"/><category term="monitoring"/><category term="osgi"/><category term="podcast"/><category term="quarkus"/><category term="testing"/><category term="training"/><category term="twitter"/><category term="apollo"/><category term="avator"/><category term="bestseller"/><category term="bpel"/><category term="content based router"/><category term="danish"/><category term="devoxx"/><category term="fab"/><category term="gae"/><category term="graalvm"/><category term="hawt"/><category term="html"/><category term="internet"/><category term="iot"/><category term="jdbc"/><category term="job"/><category term="jug"/><category term="kamelets"/><category term="nabble"/><category term="panel"/><category term="position"/><category term="releas"/><category term="report"/><category term="sabre"/><category term="scala"/><category term="spring integration"/><category term="structure101"/><category term="tuning"/><category term="vide"/><category term="webconsole"/><category term="websocket"/><category term="yourkit"/><title type='text'>Claus Ibsen (@davsclaus) riding the Apache Camel</title><subtitle type='html'>Works for Red Hat on open source integration projects such as Apache Camel, fabric8 and hawtio. Author of Camel in Action books.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.davsclaus.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>377</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-3551956354966659225</id><published>2021-07-04T20:57:00.004+02:00</published><updated>2021-07-04T20:57:38.398+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="release"/><title type='text'>Apache Camel 3.11 What&#39;s New</title><content type='html'>&lt;p&gt;&lt;b&gt;Apache Camel 3.11 has just been released.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;This is a LTS release which will be supported for 1 year with regular patch and security releases.&lt;/p&gt;&lt;p&gt;This blog post first details the noteworthy changes since the last 3.10 release from last month.&lt;/p&gt;&lt;p&gt;For readers that are upgrading from the last 3.7 LTS release then we have added a summary section that highlights all the important new features and changes (3.7 to 3.11).&lt;/p&gt;&lt;p&gt;At first what did we do since the 3.10 release.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;So what&#39;s in this release since 3.10&lt;/h3&gt;&lt;p&gt;This release introduces a set of new features and noticeable improvements that we will cover in this blog post.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Kamelets&lt;/h4&gt;&lt;p&gt;Kamelets is a higher level building blocks that we keep innovating and improve over the coming releases.&lt;/p&gt;&lt;p&gt;For Camel 3.11 we worked on making Kamelets universal across the various runtimes such as standalone, Karaf, Spring Boot, and Quarkus.&lt;/p&gt;&lt;p&gt;We added a new camel-kamelet-main component that is intended for developers to try out or develop custom Kamelets. This module runs standalone which is intentional as we want to ensure Kamelets are not tied to a specific runtime (or the cloud on Kubernetes) but are truly universal in any environment where you can use Camel.&lt;/p&gt;&lt;p&gt;You can find an example with camel-kamelet-main at &lt;a href=&quot;https://github.com/apache/camel-examples/tree/main/examples/kamelet-main&quot;&gt;https://github.com/apache/camel-examples/tree/main/examples/kamelet-main&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The YAML DSL has improved error reporting when parsing to better report to Camel end users where the problem is.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Common Source timestamp&lt;/h4&gt;&lt;p&gt;We added a `getSourceTimestamp` API on `Message` to get hold of the timestamp from the source of the message.&lt;/p&gt;&lt;p&gt;The idea is to have a common API across all the Camel components that has a timestamp of the event (such as JMS, Kafka, AWS, File/FTP etc).&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Cloud component&lt;/h4&gt;&lt;p&gt;The Camel AWS, Azure, and HuaweiCloud components have had various bug fixes and smaller improvements.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Quarkus&lt;/h4&gt;&lt;p&gt;This release is the baseline for Quarkus 2 support which is to follow shortly after this release with a new Camel Quarkus release.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Spring Boot&lt;/h4&gt;&lt;p&gt;We have upgraded to latest Spring Boot 2.5.1 release.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;No OSGi code in main project&lt;/h4&gt;&lt;p&gt;We had about six remaining Camel components which had some special OSGi Java source code.&lt;/p&gt;&lt;p&gt;The OSGi code has been ported over to the Camel Karaf project.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Better Java 16 support&lt;/h4&gt;&lt;p&gt;Although Java 16 is not officially supported, we did improve a few Camel components to make them work with Java 16.&lt;/p&gt;&lt;p&gt;The official support is Java 11 (primary) and Java 8 (secondary).&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;New components&lt;/h4&gt;&lt;p&gt;This release has a number of new components, data formats and languages:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;camel-huaweicloud-functiongraph - To call serverless functions on Huawei Cloud&lt;/li&gt;&lt;li&gt;camel-huaweicloud-iam - To securely manage users on Huawei Cloud&lt;/li&gt;&lt;li&gt;camel-kamelet-main - Main to run Kamelet standalone&lt;/li&gt;&lt;li&gt;camel-resourceresolver-github - Resource resolver to load files from GitHub&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Upgrading&lt;/h4&gt;&lt;p&gt;Make sure to read the &lt;a href=&quot;https://camel.apache.org/manual/latest/camel-3x-upgrade-guide-3_11.html&quot;&gt;upgrade guide&lt;/a&gt; if you are upgrading from a previous Camel version.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Release Notes&lt;/h4&gt;&lt;p&gt;You can find more information about this release in the &lt;a href=&quot;https://camel.apache.org/releases/release-3.11.0/&quot;&gt;release notes&lt;/a&gt;, with a list of JIRA tickets resolved in the release.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Summary of changes since the last 3.7 LTS release&lt;/h3&gt;&lt;p&gt;It is 6 months since the last 3.7 LTS release, and here is a high level summary of the most significant changes we have done:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Optimized core (faster startup and quicker routing engine)&lt;/li&gt;&lt;li&gt;Modularized core (even smaller core)&lt;/li&gt;&lt;li&gt;Reduced Object Allocations (lower memory footprint)&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Reflection free (Native compilation friendly)&lt;/li&gt;&lt;li&gt;Optimized toD EIP for messaging based components&lt;/li&gt;&lt;li&gt;Better startup and shutdown logging&lt;/li&gt;&lt;li&gt;Java Flight Recorder&lt;/li&gt;&lt;li&gt;Routes loader (Java, XML, YAML, Groovy, JavaScript, and Kotlin)&lt;/li&gt;&lt;li&gt;YAML DSL&lt;/li&gt;&lt;li&gt;Kamelets&lt;/li&gt;&lt;li&gt;17 new components&lt;/li&gt;&lt;li&gt;Support for Spring Boot 2.5 and Quarkus 2.0&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;There are many other great new features and improvements that you can find detailed in each of the &lt;i&gt;Whats New&lt;/i&gt; blog posts:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://camel.apache.org/blog/2021/02/Camel38-Whatsnew/&quot;&gt;Camel 3.8 What&#39;s New&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://camel.apache.org/blog/2021/03/Camel39-Whatsnew/&quot;&gt;Camel 3.9 What&#39;s New&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://camel.apache.org/blog/2021/05/Camel310-Whatsnew/&quot;&gt;Camel 3.10 What&#39;s New&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/3551956354966659225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=3551956354966659225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/3551956354966659225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/3551956354966659225'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2021/07/apache-camel-311-whats-new.html' title='Apache Camel 3.11 What&#39;s New'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-2844917915669335641</id><published>2021-05-29T11:15:00.006+02:00</published><updated>2021-05-29T11:19:36.325+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="camelk"/><category scheme="http://www.blogger.com/atom/ns#" term="kamelets"/><category scheme="http://www.blogger.com/atom/ns#" term="quarkus"/><category scheme="http://www.blogger.com/atom/ns#" term="video"/><category scheme="http://www.blogger.com/atom/ns#" term="webinar"/><title type='text'>Webinar: Integrate systems in the age of Quarkus and Camel</title><content type='html'>&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;A few days ago I presented a webinar where he covered all the latest innovations with Apache Camel with focus on Camel Quarkus, Camel K, and Kamelets. This trio is a powerful combination that takes Camel to another level, which allows non developers and IT professionals, to manage and bind systems together without any Camel knowledge.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=b7FxG2mKop8&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;450&quot; data-original-width=&quot;800&quot; height=&quot;225&quot; src=&quot;https://camel.apache.org/blog/2021/05/CamelWebinar/featured_hu5dffcb99d7ee348c03ee2f23f62cf7bf_194237_800x0_resize_q95_gaussian_2.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Kamelets being the Apache Camel solution for an app store experience with integration software.&lt;/p&gt;&lt;p&gt;The webinar is &lt;a href=&quot;https://www.youtube.com/watch?v=b7FxG2mKop8&quot;&gt;online on youtube&lt;/a&gt; and the &lt;a href=&quot;https://www.slideshare.net/davsclaus/integrating-systems-in-the-age-of-quarkus-and-camel&quot;&gt;slides is here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/2844917915669335641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=2844917915669335641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/2844917915669335641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/2844917915669335641'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2021/05/webinar-integrate-systems-in-age-of.html' title='Webinar: Integrate systems in the age of Quarkus and Camel'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-1858107451775045959</id><published>2021-03-16T14:07:00.001+01:00</published><updated>2021-03-16T14:07:15.941+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="roadmap"/><title type='text'>Apache Camel 3.9 - No more saw tooth JVM garbage collection</title><content type='html'>&lt;p&gt;We continue our effort to optimize Apache Camel. This is blog post part 7 which covers are latest effort on dramatically reducing the object allocations caused by Camel while routing messages.&lt;/p&gt;&lt;p&gt;The good news is that we have overachieved and was able to reduce object allocations to &lt;b&gt;ZERO!!!&lt;/b&gt; - so no more JVM memory usage graphs with saw tooth (note: in real world use-cases there will always be user data causing object allocations - but I wanted to have a click-bait blog title).&lt;/p&gt;&lt;p&gt;To help identify potential areas of improvement in the core Camel, we put together a &lt;a href=&quot;https://github.com/apache/camel-performance-tests/tree/master/profiling/timer-log&quot; target=&quot;_blank&quot;&gt;small performance application&lt;/a&gt;, which has only a single route triggered by a timer every producing 1000 msg/sec. These messages are routed to 10 different log endpoints (logging turned off). This allows us to focus on the internals of Camel only and what code paths is executed and what objects are being allocated and in-use by the internal routing engine. There are no message data (body or headers), or network communication etc.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Running the example (JVM heap size set to max 32mb) for 10 minutes profiled by JFR and browsed in JDK mission control we can see the dramatic difference.&amp;nbsp;&lt;/p&gt;&lt;p&gt;In Camel 3.8 597mb of objects is allocated by Camel in total.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-Ltqm5YjN-e8/YFCf4eM7dYI/AAAAAAAACeg/5WCmYpcNZQUJ5p9My9-vtLDQ1zBANWoSgCLcBGAsYHQ/s1620/jfr-380-10m.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;904&quot; data-original-width=&quot;1620&quot; height=&quot;224&quot; src=&quot;https://1.bp.blogspot.com/-Ltqm5YjN-e8/YFCf4eM7dYI/AAAAAAAACeg/5WCmYpcNZQUJ5p9My9-vtLDQ1zBANWoSgCLcBGAsYHQ/w400-h224/jfr-380-10m.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;And in Camel 3.9 that is &lt;b&gt;ZERO&lt;/b&gt;.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-owvFsYqVcc8/YFCibdk4lXI/AAAAAAAACeo/7RumK5IDe4Anp82GTS3Vts3MUtGE2aymACLcBGAsYHQ/s1604/jft-after-10m.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;908&quot; data-original-width=&quot;1604&quot; height=&quot;226&quot; src=&quot;https://1.bp.blogspot.com/-owvFsYqVcc8/YFCibdk4lXI/AAAAAAAACeo/7RumK5IDe4Anp82GTS3Vts3MUtGE2aymACLcBGAsYHQ/w400-h226/jft-after-10m.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;How did we get to zero?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;That is a long journey that started about a year ago, and we have gradually optimised Camel which I have blogged about in the 6 parts preceding this post.&lt;/p&gt;&lt;p&gt;All this work is like pealing an onion, layer after layer. As one layer has been optimised, then the profiler reveals another layer, and so on. This time we could identify 5 areas for improvements:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;consumers&lt;/li&gt;&lt;li&gt;core EIP patterns&lt;/li&gt;&lt;li&gt;internal routing processor&lt;/li&gt;&lt;li&gt;error handler&lt;/li&gt;&lt;li&gt;exchange and message&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The consumers are the source of incoming messages into Apache Camel. And so that is a great place to start. It&#39;s the consumers that allocate a new exchange, populate the exchange with message data such as body and headers.&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;After that it&#39;s the internal routing engine that routes the exchange via EIP patterns. And here we identified several spots where we could eliminate object allocations, or reduce allocations when some features are not in use etc. Error handling is one of the most complex part in the core Camel, and it uses objects to keep state in case of exceptions to handle redeliveries and whatnot. We were able to split the error handling into two tasks that operate either as a simplified or complex task. In the core EIP patterns we were able to optimize code that reduces object allocations.&lt;/p&gt;&lt;p&gt;The 5th area we optimized is the exchange object. EIPs and the Camel routing engine store state per exchange on the exchange instance itself as exchange properties. That data is stored in a Map which means for each entry both a key is allocated in the java.util.Map. We optimized this to use an internal object array where each key is hardcoded as an index entry in the array. That means read/write is very fast and simple as its just an array index.&amp;nbsp;&lt;/p&gt;&lt;p&gt;And then we ..... cheated ... instead of allocating new objects (via new constructor) we recycle existing objects from the previous exchange to the next. In other words we are using a sort of object pooling - this feature is called &lt;a href=&quot;https://camel.apache.org/manual/latest/exchange-pooling.html&quot; target=&quot;_blank&quot;&gt;exchange pooling&lt;/a&gt; in Camel.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Exchange Pooling&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The diagram above with ZERO object allocation is in fact with exchange pooling enabled. If exchange pooling is turned off (default), then the diagram should have been as below:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-C8tuc5Jz1PM/YFCpPROqSyI/AAAAAAAACes/GOyV5nV0vPAC69_asIn7z9s0K4KnQFshwCLcBGAsYHQ/s1616/jfr-before-10m.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;910&quot; data-original-width=&quot;1616&quot; height=&quot;225&quot; src=&quot;https://1.bp.blogspot.com/-C8tuc5Jz1PM/YFCpPROqSyI/AAAAAAAACes/GOyV5nV0vPAC69_asIn7z9s0K4KnQFshwCLcBGAsYHQ/w400-h225/jfr-before-10m.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;As you can see there is saw-tooth graph. However the total object allocation is gone down from 597mb to 492mb (18% reduction).&lt;/p&gt;&lt;p&gt;Awesome this is fantastic. And yes indeed it is. However when using anything there are both pros and cons, and so with object pooling. There is tiny tiny overhead of Camel to manage the object pools, and to &quot;scrub&quot; objects before they can be recused. That is a possibly a very very tiny CPU overhead compared to the JVM allocate and initialise new objects; instead of pool reuse. The biggest con is &lt;i&gt;object leaks&lt;/i&gt; .. if objects are no returned back in the pool. Therefore you can turn on statistics which will report a WARN if a leak is detected when you stop Camel. The objects must be manually returned back into the pool, which we have coded in all the Camel components, and of course in core Camel. Now object leaks in this situation is not severe as you just have a situation as if there are no pooling, the JVM will create a new object - so the object allocations goes up, but its not severe like a database pool leaking TCP network connections.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Upcoming work&lt;/b&gt;&lt;/p&gt;&lt;p&gt;There are a few very complex EIP patterns and Camel component which does not yet support object pooling. We have this on the roadmap for Camel 3.10.&lt;/p&gt;&lt;p&gt;Camel 3.9 is planned for release in March 2021.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/1858107451775045959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=1858107451775045959' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/1858107451775045959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/1858107451775045959'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2021/03/apache-camel-39-no-more-saw-tooth-jvm.html' title='Apache Camel 3.9 - No more saw tooth JVM garbage collection'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-Ltqm5YjN-e8/YFCf4eM7dYI/AAAAAAAACeg/5WCmYpcNZQUJ5p9My9-vtLDQ1zBANWoSgCLcBGAsYHQ/s72-w400-h224-c/jfr-380-10m.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-3745329654515708414</id><published>2021-01-20T12:35:00.002+01:00</published><updated>2021-01-20T12:35:19.430+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="monitoring"/><category scheme="http://www.blogger.com/atom/ns#" term="roadmap"/><title type='text'>Apache Camel 3.8 and Java Flight Recorder</title><content type='html'>&lt;p&gt;In the upcoming &lt;a href=&quot;https://camel.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Camel&lt;/a&gt; 3.8 release we have a new Camel component to integrate with Java Flight Recorder.&lt;/p&gt;&lt;p&gt;Camel is now capable of capturing &quot;work steps&quot; during startup that can be recorded with Java Flight Recorder. This can be used to better diagnose and find where your Camel applications may be slow to startup, for example due to a misbehaving component or custom user code.&lt;/p&gt;&lt;p&gt;The screenshot below shows a recording that has captured a Camel application that takes about 3 seconds to startup. Its a very tiny application so we expected it to be faster.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-acQuuO4-iVc/YAgTE5PqXCI/AAAAAAAACbM/qxSMaAgKZsQm3M3sbesV7M2XUbI5NTM7ACLcBGAsYHQ/s2938/jdk-mission-control.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1071&quot; data-original-width=&quot;2938&quot; height=&quot;146&quot; src=&quot;https://1.bp.blogspot.com/-acQuuO4-iVc/YAgTE5PqXCI/AAAAAAAACbM/qxSMaAgKZsQm3M3sbesV7M2XUbI5NTM7ACLcBGAsYHQ/w400-h146/jdk-mission-control.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;If we sort the events by duration in the JDK mission control, we can see that there are 4 events that take over 2 seconds.&lt;/p&gt;&lt;p&gt;The sequence is a sequence of the following step (sub step):&lt;/p&gt;&lt;p&gt;&lt;i&gt;Initializing context -&amp;gt; Initializing routes -&amp;gt; Creating route (route2) -&amp;gt; Creating Bean processor (bean1)&lt;/i&gt;&lt;/p&gt;&lt;p&gt;What we can see is that the step with the highest depth is &quot;Creating Bean processor&quot; which takes about 2 seconds. This is the culprit of the bottleneck.&lt;/p&gt;&lt;p&gt;If we check the Camel route for where bean1 is in use, its in route2 at:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; from(&quot;direct:slow&quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .to(&quot;log:slow?level=OFF&quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .bean(MyBean.class, &quot;hello&quot;);&lt;/span&gt;&lt;/p&gt;&lt;div&gt;Here we can see the bean is using MyBean class, which we can then look at next:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; public MyBean() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // force slow startup&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LOG.warn(&quot;Forcing 2 sec delay to have slow startup&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Thread.sleep(2000);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } catch (Exception e) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ignore&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;Ah okay here is the problem. The bean is sleeping for 2 seconds. Yes of course this is a made up example, but it does affect the recording and allow us to find it via the JDK mission control tool.&lt;/p&gt;&lt;p&gt;We also offer a logging recorder where you can &quot;see&quot; some of the same information as in JDK mission control. However when using JDK mission control, you have the entire JFR recording that also captures alot of JVM information about CPU and memory use and whatnot.&lt;/p&gt;&lt;p&gt;To use Java Flight Recorder with Camel, all you have to do is to add camel-jfr on the classpath. Then Camel will auto-detect this and enable it. You can configure the recorder with various options which will be documented as part of the &lt;a href=&quot;https://camel.apache.org/components/latest/others/main.html&quot; target=&quot;_blank&quot;&gt;common options&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;But for quickly finding startup bottlenecks for Camel applications then the logging recorder is a good start. The screenshot below shows the logging output, and as you can see from the red square we have identified where the &quot;2 second&quot; problem is.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-E-ucaGebs_Y/YAgTy7vRDYI/AAAAAAAACbU/RGa-11jOn3IBFgCCGqKzSbSYDK0_fGDRwCLcBGAsYHQ/s1846/jdk-logging.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;806&quot; data-original-width=&quot;1846&quot; height=&quot;175&quot; src=&quot;https://1.bp.blogspot.com/-E-ucaGebs_Y/YAgTy7vRDYI/AAAAAAAACbU/RGa-11jOn3IBFgCCGqKzSbSYDK0_fGDRwCLcBGAsYHQ/w400-h175/jdk-logging.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;The logging recorder comes out of the box in camel-core, and you can just use it by configuring:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;camel.main.startup-recorder = logging&lt;/span&gt;&lt;/p&gt;&lt;p&gt;If you are using Camel Main, Camel Quarkus etc. And for Spring Boot, you can enable it with&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;camel.springboot.startup-recorder = logging&lt;/span&gt;&lt;/p&gt;&lt;p&gt;You can also set a custom recorder, or one of the out of the box implementation via Java code:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;camelContext.adapt(ExtendedCamelContext.class)&lt;br /&gt;&amp;nbsp; .setStartupStepRecorder(...);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;You can try this example (&lt;a href=&quot;https://github.com/apache/camel-examples/tree/master/examples/camel-example-flight-recorder&quot; target=&quot;_blank&quot;&gt;camel-example-flight-recorder&lt;/a&gt;) from the Camel Examples git repository. From command line you can run&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;mvn camel:run&lt;/span&gt;&lt;/p&gt;&lt;p&gt;And Camel will automatic capture a JFR recording and save to disk. The output of the file is shown in the log, which you can then open from JDK mission control.&amp;nbsp;&amp;nbsp;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/3745329654515708414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=3745329654515708414' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/3745329654515708414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/3745329654515708414'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2021/01/apache-camel-38-and-java-flight-recorder.html' title='Apache Camel 3.8 and Java Flight Recorder'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-acQuuO4-iVc/YAgTE5PqXCI/AAAAAAAACbM/qxSMaAgKZsQm3M3sbesV7M2XUbI5NTM7ACLcBGAsYHQ/s72-w400-h146-c/jdk-mission-control.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-4481365114625421075</id><published>2020-12-21T10:00:00.001+01:00</published><updated>2020-12-21T10:00:04.018+01:00</updated><title type='text'>Apache Camel 3.7 (LTS) Released - The fastest Camel ever</title><content type='html'>&lt;p&gt;The &lt;a href=&quot;https://camel.apache.org/blog/2020/12/Camel37-Whatsnew/&quot; target=&quot;_blank&quot;&gt;Apache Camel 3.7&lt;/a&gt; was released some days ago.&lt;/p&gt;&lt;p&gt;This is a LTS release which means we will provide patch releases for one year. The next planned LTS release is 3.10 scheduled towards summer 2021.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-ahELPgoEraA/X99BA-xxHsI/AAAAAAAACZk/90cHaJOR5kA_bHJ0XFPYPeZRaYjUyMSVACLcBGAsYHQ/s488/camel-xmas.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;350&quot; data-original-width=&quot;488&quot; height=&quot;288&quot; src=&quot;https://1.bp.blogspot.com/-ahELPgoEraA/X99BA-xxHsI/AAAAAAAACZk/90cHaJOR5kA_bHJ0XFPYPeZRaYjUyMSVACLcBGAsYHQ/w400-h288/camel-xmas.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;So what&#39;s in this release&lt;/b&gt;&lt;/p&gt;&lt;p&gt;This release introduces a set of new features and noticeable improvements that we will cover in this blog post.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Pre compiled languages&lt;/b&gt;&lt;/p&gt;&lt;p&gt;We continued our avenue of making Camel faster and smaller. This time we focused on the built-in Simple scripting language.&lt;/p&gt;&lt;p&gt;First we added the &lt;a href=&quot;https://camel.apache.org/components/latest/languages/joor-language.html&quot; target=&quot;_blank&quot;&gt;jOOR language&lt;/a&gt;. jOOR is a small Java tool for performing runtime compilation of Java source code in-memory. It has some limitations but generally works well for small scripting code (requires Java 11 onwards).&lt;/p&gt;&lt;p&gt;Then we worked on compiled simple.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Compiled Simple&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The &lt;a href=&quot;https://camel.apache.org/components/latest/languages/csimple-language.html&quot; target=&quot;_blank&quot;&gt;csimple language&lt;/a&gt; is parsed into regular Java source code and compiled together with all the other source code, or compiled once during bootstrap via jOOR.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://camel.apache.org/blog/2020/12/Camel37-Whatsnew/csimple-compiled_hu4d5e12aee96372297689a000f98965d9_15785_800x0_resize_q95_gaussian_2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;260&quot; data-original-width=&quot;800&quot; height=&quot;104&quot; src=&quot;https://camel.apache.org/blog/2020/12/Camel37-Whatsnew/csimple-compiled_hu4d5e12aee96372297689a000f98965d9_15785_800x0_resize_q95_gaussian_2.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;In a nutshell, compiled simple language excels over simple language when using dynamic Object-Graph Navigation Language (OGNL) method calls.&lt;/p&gt;&lt;p&gt;For example profiling the following simple expression&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;simple&amp;gt;${exchangeProperty.user.getName} != null &amp;amp;&amp;amp; ${exchangeProperty.user.getAge} &amp;gt; 11&amp;lt;/simple&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;with the equivalent csimple expression:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;csimple&amp;gt;${exchangeProperty.user} != null &amp;amp;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;${exchangeProperty.user.getName()} != null &amp;amp;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;${exchangeProperty.user.getAge()} &amp;gt; 11&amp;lt;/csimple&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;yields a dramatic 100 times performance improvement in reduced cpu usage as shown in the screenshot:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://camel.apache.org/blog/2020/12/Camel37-Whatsnew/simple-csimple-performance_hu60d66561be8d6c486c59e1f30ced755f_548212_800x0_resize_q95_gaussian_2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;236&quot; data-original-width=&quot;800&quot; height=&quot;189&quot; src=&quot;https://camel.apache.org/blog/2020/12/Camel37-Whatsnew/simple-csimple-performance_hu60d66561be8d6c486c59e1f30ced755f_548212_800x0_resize_q95_gaussian_2.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;For more information about the compiled simple language and further break down of performance improvements then read my &lt;a href=&quot;http://www.davsclaus.com/2020/12/apache-camel-37-compiled-simple.html&quot; target=&quot;_blank&quot;&gt;recent blog post introducing the csimple language&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;We have provided two small examples that demonstrate csimple as pre compiled and as runtime compiled during bootstrap.&lt;/p&gt;&lt;p&gt;You can find these two examples from the official Apache Camel examples repository at:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/apache/camel-examples/tree/master/examples/camel-example-csimple&quot; target=&quot;_blank&quot;&gt;csimple pre compiled example&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/apache/camel-examples/tree/master/examples/camel-example-csimple-joor&quot; target=&quot;_blank&quot;&gt;csimple runtime compiled example&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Optimized core&lt;/b&gt;&lt;/p&gt;&lt;p&gt;We have continued the effort to optimize camel-core. This time a number of smaller improvements in various areas such as replacing regular expressions with regular Java code when regular expressions were overkill (regexp take up sizeable heap memory).&lt;/p&gt;&lt;p&gt;The direct component has been enhanced to avoid synchronisation when the producer calls the consumer.&lt;/p&gt;&lt;p&gt;We also enhanced the internals of the event notifier separating startup/stop events from routing events, gaining a small performance improvement during routing.&lt;/p&gt;&lt;p&gt;We also reduced the number of objects used during routing which reduced the memory usage.&lt;/p&gt;&lt;p&gt;Another significant win was to bulk together all the type converters from the core, into two classes (source generated). This avoids registering individually each type converter into the type converter registry which saves 20kb of heap memory.&lt;/p&gt;&lt;p&gt;If you are more curious about how we did these optimisations and with some performance numbers, then &lt;a href=&quot;http://www.davsclaus.com/2020/11/apache-camel-37-more-camel-core.html&quot; target=&quot;_blank&quot;&gt;read another of my recent blog posts&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Optimized components startup&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The camel core has been optimized in Camel 3 to be small, slim, and fast on startup. This benefits &lt;a href=&quot;https://camel.apache.org/camel-quarkus/latest/&quot; target=&quot;_blank&quot;&gt;Camel Quarkus&lt;/a&gt; which can do built time optimizations that take advantage of the optimized camel core.&lt;/p&gt;&lt;p&gt;We have continued this effort in the Camel components where whenever possible initialization is moved ahead to an earlier phase during startup, that allows enhanced built time optimizations. As there are a lot of Camel components then this work will progress over the next couple of Camel releases.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Separating Model and EIP processors&lt;/b&gt;&lt;/p&gt;&lt;p&gt;In this release we untangled model, reifier and processors.&lt;/p&gt;&lt;p&gt;This is a great achievement which allows us to take this even further with design time vs runtime.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Model&amp;nbsp; &amp;nbsp; -&amp;gt;&amp;nbsp; &amp;nbsp; Reifier&amp;nbsp; &amp;nbsp;-&amp;gt;&amp;nbsp; &amp;nbsp;Processor&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; (startup)&amp;nbsp; &amp;nbsp; &amp;nbsp; (startup)&amp;nbsp; &amp;nbsp; &amp;nbsp; (runtime)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The model is the structure of the DSL which you can think of as _design time_ specifying your Camel routes. The model is executed once during startup and via the reifier (factory) the runtime EIP processors is created. After this work is done, the model is essentially not needed anymore.&lt;/p&gt;&lt;p&gt;By separating this into different JARs (camel-core-model, camel-core-reifier, camel-core-processor) then we ensure they are separated and this allows us to better do built time optimizations and dead code elimination via &lt;a href=&quot;https://quarkus.io/&quot; target=&quot;_blank&quot;&gt;Quarkus&lt;/a&gt;&amp;nbsp;and/or GraalVM.&lt;/p&gt;&lt;p&gt;This brings up to lightweight mode.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Lightweight mode&lt;/b&gt;&lt;/p&gt;&lt;p&gt;We started an experiment earlier with a lightweight mode. With the separation of the model from the processors, then we have a great step forward, which allowed us to make the lightweight mode available for end users to turn on.&lt;/p&gt;&lt;p&gt;In lightweight mode Camel removes all references to the model after startup which causes the JVM to be able to garbage collect all model objects and unload classes, freeing up memory.&lt;/p&gt;&lt;p&gt;After this it&#39;s no longer possible to dynamically add new Camel routes. The lightweight mode is intended for microservice/serverless architectures, with a &lt;i&gt;closed world&lt;/i&gt; assumption.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Autowiring components&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The Camel components is now capable of autowiring by type. For example the &lt;a href=&quot;https://camel.apache.org/components/latest/aws-sqs-component.html&quot; target=&quot;_blank&quot;&gt;AWS SQS&lt;/a&gt;&amp;nbsp;components can automatically lookup in the registry if there is a single instance of SqsClient, and then pre configure itself.&amp;nbsp;&lt;/p&gt;&lt;p&gt;We have marked up in the Camel documentation which component options supports this by showing &lt;b&gt;Autowired&lt;/b&gt; in bold in the description.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Salesforce fixes&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Our recent Camel committer Jeremy Ross did great work to improve and fix bugs in the camel-salesforce component. We expect more to come from him.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;VertX Kafka Component&lt;/b&gt;&lt;/p&gt;&lt;p&gt;A new Kafka component has been developed that uses the Vert.X Kafka Java Client which allows us to use all of its features, and also its robustness and stability.&lt;/p&gt;&lt;p&gt;The camel-vertx-kafka component is intended to be (more) feature complete with the existing camel-kafka component. We will continue this work for the next couple of Camel releases.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;DataSonnet&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The new &lt;a href=&quot;https://camel.apache.org/components/latest/languages/datasonnet-language.html&quot; target=&quot;_blank&quot;&gt;camel-datasonnet&lt;/a&gt; component, is to be used for data transformation using the &lt;a href=&quot;https://datasonnet.com/&quot; target=&quot;_blank&quot;&gt;DataSonnet&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;DataSonnet is an open source JSON-centric, template-based data transformation standard built to rival proprietary options available in the market.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Spring Boot&lt;/b&gt;&lt;/p&gt;&lt;p&gt;We have upgraded to Spring Boot 2.4.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;New components&lt;/b&gt;&lt;/p&gt;&lt;p&gt;This release has 7 new components, data formats or languages:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;AtlasMap: Transforms the message using an [AtlasMap](https://www.atlasmap.io/) transformation&lt;/li&gt;&lt;li&gt;Kubernetes Custom Resources: Perform operations on Kubernetes Custom Resources and get notified on Deployment changes&lt;/li&gt;&lt;li&gt;Vert.X Kafka: Sent and receive messages to/from an Apache Kafka broker using vert.x Kafka client&lt;/li&gt;&lt;li&gt;JSON JSON-B: Marshal POJOs to JSON and back using JSON-B&lt;/li&gt;&lt;li&gt;CSimple: Evaluate a compile simple expression language&lt;/li&gt;&lt;li&gt;DataSonnet: To use DataSonnet scripts in Camel expressions or predicates&lt;/li&gt;&lt;li&gt;jOOR: Evaluate a jOOR (Java compiled once at runtime) expression language&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Upgrading&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Make sure to read the &lt;a href=&quot;https://camel.apache.org/manual/latest/camel-3x-upgrade-guide-3_7.html&quot;&gt;upgrade guide&lt;/a&gt; if you are upgrading to this release from a previous Camel version.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;More details&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The previous LTS release was Camel 3.4. We have blog posts for what&#39;s new in &lt;a href=&quot;https://camel.apache.org/blog/2020/09/Camel35-Whatsnew/&quot; target=&quot;_blank&quot;&gt;Camel 3.5&lt;/a&gt; and &lt;a href=&quot;https://camel.apache.org/blog/2020/10/Camel36-Whatsnew/&quot; target=&quot;_blank&quot;&gt;Camel 3.6&lt;/a&gt; you may want to read to cover all news between the two LTS releases.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Release Notes&lt;/b&gt;&lt;/p&gt;&lt;p&gt;You can find more information about this release in the &lt;a href=&quot;https://camel.apache.org/releases/release-3.7.0/&quot; target=&quot;_blank&quot;&gt;release notes&lt;/a&gt;, with a list of JIRA tickets resolved in the release.&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/4481365114625421075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=4481365114625421075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/4481365114625421075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/4481365114625421075'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/12/apache-camel-37-lts-released-fastest.html' title='Apache Camel 3.7 (LTS) Released - The fastest Camel ever'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-ahELPgoEraA/X99BA-xxHsI/AAAAAAAACZk/90cHaJOR5kA_bHJ0XFPYPeZRaYjUyMSVACLcBGAsYHQ/s72-w400-h288-c/camel-xmas.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-7849856706801287403</id><published>2020-12-09T14:29:00.005+01:00</published><updated>2020-12-09T14:29:59.290+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="roadmap"/><title type='text'>Apache Camel 3.7 - Compiled Simple Language (Part 6)</title><content type='html'>&lt;p&gt;I have previously blogged about the optimizations we are doing in the Apache Camel core. The first 3 blogs (&lt;a href=&quot;http://www.davsclaus.com/2020/01/apache-camel-31-more-camel-core.html&quot; target=&quot;_blank&quot;&gt;part1&lt;/a&gt;, &lt;a href=&quot;http://www.davsclaus.com/2020/01/apache-camel-31-more-camel-core_30.html&quot; target=&quot;_blank&quot;&gt;part2&lt;/a&gt;, &lt;a href=&quot;http://www.davsclaus.com/2020/02/apache-camel-31-more-camel-core.html&quot; target=&quot;_blank&quot;&gt;part3&lt;/a&gt;) were a while back leading up to the 3.4 LTS release.&lt;/p&gt;&lt;p&gt;We have done more work (&lt;a href=&quot;http://www.davsclaus.com/2020/10/apache-camel-36-more-camel-core.html&quot; target=&quot;_blank&quot;&gt;part4&lt;/a&gt;, &lt;a href=&quot;http://www.davsclaus.com/2020/11/apache-camel-37-more-camel-core.html&quot; target=&quot;_blank&quot;&gt;part5&lt;/a&gt;) and this (part 6) that will be included in the next Camel 3.7 LTS release (to be released this month).&amp;nbsp;&lt;/p&gt;&lt;p&gt;This time we worked on a new variation of the Camel simple language, called csimple.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-FhxLjDp6wuE/X9DQUShtJAI/AAAAAAAACYU/htnhr1oVPR8GP_ARRV73HiibSW96P36JwCLcBGAsYHQ/s1400/csimple-compiled.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;456&quot; data-original-width=&quot;1400&quot; height=&quot;130&quot; src=&quot;https://1.bp.blogspot.com/-FhxLjDp6wuE/X9DQUShtJAI/AAAAAAAACYU/htnhr1oVPR8GP_ARRV73HiibSW96P36JwCLcBGAsYHQ/w400-h130/csimple-compiled.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Compiled Simple (csimple)&lt;/h4&gt;&lt;p&gt;The &lt;a href=&quot;https://camel.apache.org/components/latest/languages/csimple-language.html&quot; target=&quot;_blank&quot;&gt;csimple language&lt;/a&gt; is parsed into regular Java source code and compiled together with all the other source code, or compiled once during bootstrap via the camel-csimple-joor module.&lt;/p&gt;&lt;p&gt;To better understand why we created csimple then you can read on about the difference between simple and csimple (in the section further below). But first let me show you some numbers.&lt;/p&gt;&lt;p&gt;I profiled a Camel application that processes 1 million messages, which are triggered in-memory via a timer, and calls a bean to select a random User object that contains user information. The message is then multicasted and processed concurrently by 10 threads, which does some content based routing based on information on the User object.&lt;/p&gt;&lt;p&gt;The Camel route is from a Spring XML file, and then a few Java beans to represent the User object and the bean to select a random user.&lt;/p&gt;&lt;p&gt;The application is profiled running with simple and csimple language until all messages has been processed.&lt;/p&gt;&lt;p&gt;The main focus is the difference between the following simple and csimple expression (XML DSL)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;lt;simple&amp;gt;${exchangeProperty.user.getName} != null &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ${exchangeProperty.user.getAge} &amp;gt; 11&lt;br /&gt;&amp;lt;/simple&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;lt;csimple&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;${exchangeProperty.user} != null &amp;amp;&amp;amp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;${exchangeProperty.user.getName()} != null &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;${exchangeProperty.user.getAge()} &amp;gt; 11&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;lt;/csimple&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;At first glance they may look identical, but the csimple language has an additional not null check whether the user object exists or not. You may think that the csimple language contains type information but it does actually not. We have &quot;cheated&quot; by using an alias (a feature in csimple) which can be configured in camel-csimple.properties file as shown:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# import our user so csimple language can use the shorthand classname&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;import org.example.User;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# alias to make it shorter to type this&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;exchangeProperty.user = exchangePropertyAs(&#39;user&#39;, User.class)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here we can see the alias is referring to the exchangePropertyAs function that takes the property name as first input, and then the class name as 2nd input. And because we have a Java import statement in the top of the properties file, we can type the local classname User.class instead of org.example.User.&lt;/div&gt;&lt;p&gt;The csimple script gets parsed into the following Java source code, which is then compiled by the regular Java compiler together with the rest of the application source code:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; public Object evaluate(CamelContext context, Exchange exchange, Message message, Object body) throws Exception {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return isNotEqualTo(exchange, exchangePropertyAs(exchange, &quot;user&quot;, User.class), null) &amp;amp;&amp;amp; isNotEqualTo(exchange, exchangePropertyAs(exchange, &quot;user&quot;, User.class).getName(), null) &amp;amp;&amp;amp; isGreaterThan(exchange, exchangePropertyAs(exchange, &quot;user&quot;, User.class).getAge(), 11);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Performance numbers&lt;/h3&gt;&lt;div&gt;Okay lets get back to the performance numbers. The raw data is presented below as screenshot and table.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-0n7GFgRoaKw/X9DElgQTqYI/AAAAAAAACX8/ScvddUMnDSI-Ye-OaCiwaeixsWePUBruACLcBGAsYHQ/s1644/simple-csimple-memory.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;484&quot; data-original-width=&quot;1644&quot; height=&quot;118&quot; src=&quot;https://1.bp.blogspot.com/-0n7GFgRoaKw/X9DElgQTqYI/AAAAAAAACX8/ScvddUMnDSI-Ye-OaCiwaeixsWePUBruACLcBGAsYHQ/w400-h118/simple-csimple-memory.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-WiqeFfWMQl0/X9DKjwI_yXI/AAAAAAAACYI/razTok7h9kM3WJ5GbZDWDM0ptCNHOpJEACLcBGAsYHQ/s1744/cs-memory.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;604&quot; data-original-width=&quot;1744&quot; height=&quot;139&quot; src=&quot;https://1.bp.blogspot.com/-WiqeFfWMQl0/X9DKjwI_yXI/AAAAAAAACYI/razTok7h9kM3WJ5GbZDWDM0ptCNHOpJEACLcBGAsYHQ/w400-h139/cs-memory.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;CPU usage&lt;/b&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;simple&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 814815 millis&lt;br /&gt;&lt;/span&gt;csimple&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;7854 millis&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Memory usage&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;simple&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;123 objects&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;5328 bytes&lt;br /&gt;bean&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3171 objects &lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;177680 bytes&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;csimple&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3 objects&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; 792 bytes&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;As we can see the cpu usages is dramatically &lt;b&gt;reduced by a factor of 100&lt;/b&gt; (one hundred).&lt;/p&gt;&lt;p&gt;The memory usage is also reduced. The simple language uses OGNL expression with the bean language and hence we should calculate the combined usage which then is roughly 3294 objects taking up about 183kb of heap memory. (the bean language has introspection cache and other things). The csimple language is very very tiny with just 3 objects taking up 792 bytes of heap memory. The memory usage is dramatically &lt;b&gt;reduced by a factor of 231&lt;/b&gt;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The memory screenshot includes simple language for both runs, the reason is that there are some basic simple expressions in the route which was not changed to csimple. Only the script that performed the most complex expression with OGNL on the User object.&lt;/p&gt;&lt;p&gt;So all together is a very dramatic reduction in both cpu and memory. How can this be?&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Very low footprint, why?&lt;/h3&gt;&lt;div&gt;The low footprint is because of mainly two reasons&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1)&lt;/div&gt;&lt;div&gt;The script is compiled as Java code by the Java compiler either at build time or during bootstrap.&lt;/div&gt;&lt;p&gt;2)&lt;br /&gt;The script is not using bean language / bean introspection with reflection for OGNL paths. However this requires the script to include type information so the Java compiler knows the types to compile the OGNL paths as regular java method calls. This is the main driver of the reduced footprint on both memory and cpu. Basic scripts such as ${header.zipCode} != null would have similar footprint. However csimple with pre compiled would have lower footprint as the script is pre parsed which otherwise would have to happen during bootstrap to generate the Java source code for the Java compiler to do an in-memory compilation; which will impact the startup performance.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Are they any limitations?&lt;/h3&gt;&lt;div&gt;Yes the csimple language is not a 100% replacement for simple (we will continue to improve the feature parity). In the Camel 3.7 release csimple is in preview mode and have the following limitations&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- nested functions is currently not supported&lt;/div&gt;&lt;div&gt;- null safe operator is not supported&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And for OGNL paths, then as previously mentioned, then csimple requires to be type safe, by including the types of the objects.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Difference between simple and csimple&lt;/h3&gt;&lt;p&gt;The simple language is a dynamic expression language which is runtime parsed into a set of Camel Expressions or Predicates.&lt;/p&gt;&lt;p&gt;The csimple language is parsed into regular Java source code and compiled together with all the other source code, or compiled once during bootstrap via the camel-csimple-joor module.&lt;/p&gt;&lt;p&gt;The simple langauge is generally very lightweight and fast, however for some use-cases with dynamic method calls via OGNL paths, then the simple language does runtime introspection and reflection calls. This has an overhead on performance, and was one of the reasons why csimple was created.&lt;/p&gt;&lt;p&gt;The csimple language requires to be typesafe and method calls via OGNL paths requires to know the type during parsing. This means for csimple languages expressions you would need to provide the class type in the script, where as simple introspects this at runtime.&lt;/p&gt;&lt;p&gt;In other words the simple language is using duck typing (if it looks like a duck, and quacks like a duck, then it is a duck) and csimple is using Java type (typesafety). If there is a type error then simple will report this at runtime, and with csimple there will be a Java compilation error.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Any examples for me to try?&lt;/h3&gt;&lt;p&gt;We have provide two small examples that demonstrate csimple as pre compiled and as runtime compiled during bootstrap. You can find these two examples from the official Apache Camel examples repository at:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/apache/camel-examples/tree/master/examples/camel-example-csimple&quot; target=&quot;_blank&quot;&gt;csimple pre compiled example&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/apache/camel-examples/tree/master/examples/camel-example-csimple-joor&quot; target=&quot;_blank&quot;&gt;csimple runtime compiled example&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Whats Next&lt;/h3&gt;&lt;p&gt;We want to implement the missing feature for nested functions and the null safe operator. We are also working on camel-quarkus to make csimple optimized for Quarkus and GraalVM. This effort is already started and Camel 3.7 will come with the first work in this area.&lt;/p&gt;&lt;p&gt;We also want to work on speeding up the runtime compilation to be able to do batch compilation. Currently each csimple script is compiled sequentially.&amp;nbsp;&lt;/p&gt;&lt;p&gt;And we want to take a look at if we can make runtime compilation work better with Spring Boot in its tar jar mode.&lt;/p&gt;&lt;p&gt;However at first enjoy csimple in the upcoming Camel 3.7 LTS release and as always we want your feedback and &lt;a href=&quot;https://camel.apache.org/manual/latest/contributing.html&quot; target=&quot;_blank&quot;&gt;love contributions&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/7849856706801287403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=7849856706801287403' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/7849856706801287403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/7849856706801287403'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/12/apache-camel-37-compiled-simple.html' title='Apache Camel 3.7 - Compiled Simple Language (Part 6)'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-FhxLjDp6wuE/X9DQUShtJAI/AAAAAAAACYU/htnhr1oVPR8GP_ARRV73HiibSW96P36JwCLcBGAsYHQ/s72-w400-h130-c/csimple-compiled.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-8547272165764074643</id><published>2020-11-04T14:34:00.003+01:00</published><updated>2020-11-04T14:35:01.868+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="roadmap"/><title type='text'>Apache Camel 3.7 - More camel-core optimizations coming (Part 5)</title><content type='html'>&lt;p&gt;I have previously blogged about the optimziations we are doing in the Apache Camel core. The first 3 blogs (&lt;a href=&quot;http://www.davsclaus.com/2020/01/apache-camel-31-more-camel-core.html&quot;&gt;part1&lt;/a&gt;, &lt;a href=&quot;http://www.davsclaus.com/2020/01/apache-camel-31-more-camel-core_30.html&quot;&gt;part2&lt;/a&gt;, &lt;a href=&quot;http://www.davsclaus.com/2020/02/apache-camel-31-more-camel-core.html&quot;&gt;part3&lt;/a&gt;) were a while back leading up to the 3.4 LTS release.&lt;/p&gt;&lt;p&gt;Now we have done some more work (&lt;a href=&quot;http://www.davsclaus.com/2020/10/apache-camel-36-more-camel-core.html&quot;&gt;part4&lt;/a&gt;) and this part 5 that is coming up in the next 3.7 LTS release.&amp;nbsp;&lt;/p&gt;&lt;p&gt;This time we have mainly been focusing on reducing the footprint of Camel after bootstrapping.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;separating&amp;nbsp;design time model vs runtime processors&lt;/b&gt;&lt;/p&gt;&lt;p&gt;We have continued the modularisation and have separated the design time vs runtime parts in the core.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The route model is now in camel-core-model, and the runtime EIP implementations are in camel-core-processor. And in between we have camel-core-reifier which transforms the model into processors. This separation plays a significant part of continued effort of making Camel even smaller, such as Quarkus and GraalVM runtimes. This will essentially allow us to pre build from the route model the runtime processors, and then at runtime not even include the model and reifier classes. There is still some work to get to the finish line, but Camel 3.7 is a major step forward.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Lightweight mode&lt;/b&gt;&lt;/p&gt;&lt;p&gt;For runtimes that are not Quarkus or GraalVM based, then we have a new lightweight switch in camel-main / CamelContext that can be turned on, that does some internal optimizations by null&#39;ing the model and reifiers from the runtime processors, which then aids the JVM garbage collector, so it can reduce memory.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The following two screenshots shows the camel-example-main-tiny running with Camel 3.4.4 and 3.7.0 (lightweight mode).&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-qS6fZRjYryE/X6KkJtxbdJI/AAAAAAAACVk/Z4UzBN3kNJg5Jx0Sa9QB3OtSVZ8Uk-9uQCLcBGAsYHQ/s1644/memory-344.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;656&quot; data-original-width=&quot;1644&quot; height=&quot;160&quot; src=&quot;https://1.bp.blogspot.com/-qS6fZRjYryE/X6KkJtxbdJI/AAAAAAAACVk/Z4UzBN3kNJg5Jx0Sa9QB3OtSVZ8Uk-9uQCLcBGAsYHQ/w400-h160/memory-344.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-S6j97Ef7kDg/X6KkJmrtP4I/AAAAAAAACVg/gGMNXJ1kWCAYr1-mWp_iVdUiDyQRfjWigCLcBGAsYHQ/s1454/memory-370.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;498&quot; data-original-width=&quot;1454&quot; height=&quot;138&quot; src=&quot;https://1.bp.blogspot.com/-S6j97Ef7kDg/X6KkJmrtP4I/AAAAAAAACVg/gGMNXJ1kWCAYr1-mWp_iVdUiDyQRfjWigCLcBGAsYHQ/w400-h138/memory-370.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;The top screenshots shows that there are 731 Camel objects and that they take up about 58kb of memory in the heap. Now in Camel 3.7 this has been significant improved as there are only 340 objects and they take up 25kb. This means Camel has shrunk to half the size in memory footprint. The memory referred to here is the memory used by Camel to bootstrap and start itself.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Improved type converter&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The type converter system have been optimized to be quicker for common convertions, and as well reducing the number of method calls during a conversion. The core converters are now bulked together and source code generated into 1 class per maven artefacts (2 in total for core). Before this there was about 10 different converter classes. This helps reduce the footprint of the type converter registry significantly. Now all the core converters are referenced by just 2 classes. Before each converter method was registered via a double keyed map which leads to a map containing 200 converters (takes up 20kb of heap memory). And on top of that then each converter method is invoked via lambda call that the JVM compiles into a separate class (so there was also 100 extra classes loaded). So all together this greatly reduces the footprint by lowering the heap memory usage by 20kb and 100 less classes loaded. And if you are using any of the XML components then camel-core-jaxb/camel-core-jaxp comes with 100 converters as well, which means if they were loaded then that would double the memory footprint. And the type converter is now also faster as the lookup of the converter is quicker and uses just Java primitives, where as before new objects was created as keys to lookup in the internal registry map. So there is also less garbage for GC.&lt;/p&gt;&lt;p&gt;The following screenshot shows the same example as before with Camel 3.7.0 (no lightweight mode):&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-rK1ic1obJCE/X6Kmro7xlHI/AAAAAAAACV0/GHX5F6uu9wwdyu9bmA57HdYqZIwQdyQQwCLcBGAsYHQ/s1718/memory-370b.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;700&quot; data-original-width=&quot;1718&quot; height=&quot;163&quot; src=&quot;https://1.bp.blogspot.com/-rK1ic1obJCE/X6Kmro7xlHI/AAAAAAAACV0/GHX5F6uu9wwdyu9bmA57HdYqZIwQdyQQwCLcBGAsYHQ/w400-h163/memory-370b.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Here we can see that there are 346 objects and they take up 28kb of memory. That is only +6 objects and +3kb more memory. So the lightweight mode did not in this example reduce as much memory. That is because there is only 1 route and 4 different models in use. If the application has more routes and more EIP models and reifiers, then more memory would be reduced.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The cost is however that the application cannot dynamically add new routes (via the model). The lightweight mode should be used with caution and it is only for &quot;static Camel applications&quot;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Optimized direct component&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The direct component has been optimized to wire up its producers and consumers during startup. Before the direct producer would for each message then lookup its associated consumer before sending the message to the consumer. We have moved this to an earlier phase. And then in case a consumer is stopped / removed / or re-created etc then the producer is capable of invalidating its old wiring and re-associate to the new consumer. This improved avoids internal lookup and thread synchronisation.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Optimized event notifier&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Another performance improvement was to divide event notifiers into lifecycle vs messaging events. As lifecycle events such as staritng and stopping Camel does not affect what happens during routing messages. We use this knowledge to avoid checking for runtime events, in the routing engine, if there isn&#39;t any custom lifecycle added to Camel.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Parsing without regular expressions&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Some parts in Camel uses regular expressions to parse, such as a string to long time converter, so you could convert 10m30s (as 10 minutes and 30 seconds). This was using several regular expressions. However when they get compiled by JVM they objects in memory are rather large. There are other places internal in Camel that regular expression was used for more basic parsing. So we rewrote those using plain basic Java and this reduced the memory and has better performance. As using regular expression in the first place was a bit overkill.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;BootstrapCloseable&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Naming in IT is hard, so we named a new marker interface BootstrapCloseable, after java.io.Closeable. We use this to mark services and other entities in Camel as something that are only used during bootstrapping Camel. Then after Camel has been started, we will then invoke those so they can free up resources and memory.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;More to come&lt;/b&gt;&lt;/p&gt;&lt;p&gt;There will be more to come for Camel 3.7. But at this point we wanted to share the good news that Camel is on a diet and have shrunk to half the size for its memory footprint (startup).&amp;nbsp;&lt;/p&gt;&lt;p&gt;We have plans to look at a compiled simple language which would greatly improve performance for some simple expressions that are dynamic and use method calls. One area of inspiration is the new &lt;a href=&quot;https://camel.apache.org/components/latest/languages/joor-language.html&quot;&gt;camel-joor&lt;/a&gt; language which gets compiled to Java during bootstrap.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/8547272165764074643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=8547272165764074643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/8547272165764074643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/8547272165764074643'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/11/apache-camel-37-more-camel-core.html' title='Apache Camel 3.7 - More camel-core optimizations coming (Part 5)'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-qS6fZRjYryE/X6KkJtxbdJI/AAAAAAAACVk/Z4UzBN3kNJg5Jx0Sa9QB3OtSVZ8Uk-9uQCLcBGAsYHQ/s72-w400-h160-c/memory-344.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-807538994357196201</id><published>2020-10-09T11:32:00.000+02:00</published><updated>2020-10-09T11:32:31.125+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="roadmap"/><title type='text'>Apache Camel 3.6 - More camel-core optimizations coming (Part 4)</title><content type='html'>&lt;p&gt;I have previously blogged about the optimziations we are doing in the Apache Camel core. The first 3 blogs (&lt;a href=&quot;http://www.davsclaus.com/2020/01/apache-camel-31-more-camel-core.html&quot; target=&quot;_blank&quot;&gt;part1&lt;/a&gt;, &lt;a href=&quot;http://www.davsclaus.com/2020/01/apache-camel-31-more-camel-core_30.html&quot; target=&quot;_blank&quot;&gt;part2&lt;/a&gt;, &lt;a href=&quot;http://www.davsclaus.com/2020/02/apache-camel-31-more-camel-core.html&quot; target=&quot;_blank&quot;&gt;part3&lt;/a&gt;) were a while back leading up to the 3.4 LTS release.&lt;/p&gt;&lt;p&gt;Now we have done some more work that is coming in Camel 3.6 leading up to the next 3.7 LTS release.&lt;/p&gt;&lt;p&gt;To speedup startup we switched to a new uuid generator. The old (classic) generator was inherited from Apache ActiveMQ which needed to ensure its ids were unique in a network of brokers, and therefore to ensure this the generator was using the hostname as prefix in the id. This required on startup to do a network access to obtain this information which costs a little time. Also depending on networks this can be more restrictive and delay the startup. The new generator is a pure in-memory fast generator that was used by Camel K and Camel Quarkus.&lt;/p&gt;&lt;p&gt;We also identified a few other spots during route initialization. For example one small change was to avoid doing some regular expression masking on route endpoints which wasn&#39;t necessary anymore.&lt;/p&gt;&lt;p&gt;Now the bigger improvements are in the following areas&lt;/p&gt;&lt;p&gt;&lt;b&gt;Avoid throwing exceptions&lt;/b&gt;&lt;/p&gt;&lt;p&gt;We identified on spring runtimes that Camel would query the spring bean registry for known beans by id, which the Spring framework would throw a NoSuchBeanDefinitionException if the bean is not present. As Camel does a bit of optional bean discovery during bootstrap, we found a way to avoid this which prevents this.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Singleton languages&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Another related problem is that in Camel 3 due to the modularization then some of the languages (bean, simple, and others) have been changed from being a singleton to prototype scoped. This is in fact one of the biggest problems and we had a Camel user report a problem with thread contention in a high concurrent use-case would race for resolving languages (they are prototype scoped). So you would have this problem, and because the language resolver would query the registry first then Spring would throw that no such bean exception, and then Camel would resolve the language via its own classpath resolver. So all together this cost performance. We can see this in the screenshots from the profiler in the following.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-Z1cfZX4UPfI/X4AnjnSnc5I/AAAAAAAACTU/XqQSfdCpd2wvI_0KXgyY7w6IovlRBbTGgCLcBGAsYHQ/s2482/350-blocked.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1068&quot; data-original-width=&quot;2482&quot; src=&quot;https://1.bp.blogspot.com/-Z1cfZX4UPfI/X4AnjnSnc5I/AAAAAAAACTU/XqQSfdCpd2wvI_0KXgyY7w6IovlRBbTGgCLcBGAsYHQ/s320/350-blocked.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-6g2ysd-nAAE/X4Anjqjjn7I/AAAAAAAACTY/CHXzTVx2uqkAtaJ1D5ESolGci-PHnRN8ACLcBGAsYHQ/s2388/360-blocked.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;840&quot; data-original-width=&quot;2388&quot; src=&quot;https://1.bp.blogspot.com/-6g2ysd-nAAE/X4Anjqjjn7I/AAAAAAAACTY/CHXzTVx2uqkAtaJ1D5ESolGci-PHnRN8ACLcBGAsYHQ/s320/360-blocked.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;The top screenshot is using Camel 3.5 and the bottom 3.6. In the top we can see the threads are blocked in Camels resolveLanguage method. And in 3.6 then its actually the log4j logger that is blocking for writing to the log file. Both applications are using the same Camel application and have been running for about 8 minutes.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Reduce object allocations&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The next screenshots are showing a sample of the object allocations.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-qgdNqOhKbyo/X4AoUiYZ-_I/AAAAAAAACTg/0QaLtbYwtSor8Xv6s2Q18yIxa6GfabqCgCLcBGAsYHQ/s2046/350-allocations.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;544&quot; data-original-width=&quot;2046&quot; src=&quot;https://1.bp.blogspot.com/-qgdNqOhKbyo/X4AoUiYZ-_I/AAAAAAAACTg/0QaLtbYwtSor8Xv6s2Q18yIxa6GfabqCgCLcBGAsYHQ/s320/350-allocations.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-bFRCi1trEBE/X4AoUgq3H6I/AAAAAAAACTk/plymeUJZZ8Y7DW91zBobjtW-GW0qQbKvQCLcBGAsYHQ/s1846/360-allocations.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;534&quot; data-original-width=&quot;1846&quot; src=&quot;https://1.bp.blogspot.com/-bFRCi1trEBE/X4AoUgq3H6I/AAAAAAAACTk/plymeUJZZ8Y7DW91zBobjtW-GW0qQbKvQCLcBGAsYHQ/s320/360-allocations.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;With Camel 3.5 we are average about 1000 obj/sec and with 3.6 we are down to about a 1/3th.&lt;/p&gt;&lt;p&gt;One of the improvements to help reduce the object allocations was how parameters to languages was changed from using a Map to a plain object array. The Map takes up more memory and object allocations than a single fixed object array.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Do as much init as possible&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Another performance improvement that aids during runtime was that we moved as much we could from the evaluation to the initialization phase in the Camel languages (simple, bean, etc.). We did this by introducing the init phase and ensuring CamelContext was carried around in the interns so we can use the context during the init phase, where its really needed. This ensures the runtime evaluation is as fast as possible.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Other smaller optimizations&lt;/b&gt;&lt;/p&gt;&lt;p&gt;We also improved the simple language to be a bit smarter in its binary operators (such as header.foo &amp;gt; 100). Now the simple language has stronger types for numeric and boolean types during its parsing, which allows us to know better from the right and left hand side of the binary operator to do type coercion so the types are comparable by the JVM. Before we may end up with falling back to converting to string types on both sides. And there is more to come, I have some ideas how to work on a compiled simple language.&lt;/p&gt;&lt;p&gt;The screenshots below shows a chart with the CPU, object allocations and thrown exceptions.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-bkWON32w2NE/X4ArD16CGII/AAAAAAAACT4/HGhG-t_A6HoUPTNCx_LxvhXf_6X8cH2FQCLcBGAsYHQ/s2048/350-performance.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1047&quot; data-original-width=&quot;2048&quot; src=&quot;https://1.bp.blogspot.com/-bkWON32w2NE/X4ArD16CGII/AAAAAAAACT4/HGhG-t_A6HoUPTNCx_LxvhXf_6X8cH2FQCLcBGAsYHQ/s320/350-performance.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-PGPnX2alJNw/X4ArD3d7l3I/AAAAAAAACT0/Q8g-4MMhCG8yr6dPwvmMHcsw7If04E6gACLcBGAsYHQ/s2232/360-performance.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;936&quot; data-original-width=&quot;2232&quot; src=&quot;https://1.bp.blogspot.com/-PGPnX2alJNw/X4ArD3d7l3I/AAAAAAAACT0/Q8g-4MMhCG8yr6dPwvmMHcsw7If04E6gACLcBGAsYHQ/s320/360-performance.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;As we can see this summarise what was mentioned was done to optimize. The number of exceptions has been reduced to 0 at runtime. There is about 3500 thrown during bootstrap (that is Java JAXB which is used for loading the spring XML file with the Camel routes used for the sample application). We do have a &lt;a href=&quot;http://www.davsclaus.com/2020/03/apache-camel-31-fast-loading-of-xml.html&quot; target=&quot;_blank&quot;&gt;fast XML loader&lt;/a&gt; in Camel that is not using JAXB.&lt;/p&gt;&lt;p&gt;Another improvement we did was to build a source code generator for a new UriFactory which allows each component to quickly build dynamic endpoint URIs from a Map of parameters. The previous solution was to use RuntimeCamelCatalog that was more generic and required loading component metadata from json descriptor files. A few components use this to optimize the toD (such as http components). By this change we avoid the runtime catalog as dependency (reduce JAR size) and the source code generated uri factory is much faster (its speedy plain Java). However the sample application used for this blog did not use toD nor the UriFactory.&lt;/p&gt;&lt;p&gt;Apache Camel 3.6 is scheduled for release later this month of October. It&#39;s going to be the fastest Camel ever ;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/807538994357196201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=807538994357196201' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/807538994357196201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/807538994357196201'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/10/apache-camel-36-more-camel-core.html' title='Apache Camel 3.6 - More camel-core optimizations coming (Part 4)'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-Z1cfZX4UPfI/X4AnjnSnc5I/AAAAAAAACTU/XqQSfdCpd2wvI_0KXgyY7w6IovlRBbTGgCLcBGAsYHQ/s72-c/350-blocked.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-6012284122376998666</id><published>2020-07-27T16:39:00.000+02:00</published><updated>2020-07-27T16:39:19.398+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="camelk"/><category scheme="http://www.blogger.com/atom/ns#" term="presentation"/><title type='text'>BarcelonaJUG talk on Tuesday July 28th about Camel 3 in the era of Kubernetes and Serverless</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Just back from PTO and myself and Andrea Cosentino are on the spot tomorrow where we have been invited by Barcelona JUG to give a talk about the Camel 3 and its latest innovation around Kubernetes and Serverless (and Kafka).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-n-qFXEoQCPU/Xx7mxK1FBjI/AAAAAAAACOc/MfwGlrxLrBkhtZPWrHQBjhHgF1sOtHdCgCLcBGAsYHQ/s1600/barca-jug.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;133&quot; data-original-width=&quot;200&quot; src=&quot;https://1.bp.blogspot.com/-n-qFXEoQCPU/Xx7mxK1FBjI/AAAAAAAACOc/MfwGlrxLrBkhtZPWrHQBjhHgF1sOtHdCgCLcBGAsYHQ/s1600/barca-jug.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
It&#39;s a free and online event, in English, tomorrow Tuesday 28th at 19.00 CEST&lt;br /&gt;
&lt;a href=&quot;https://www.meetup.com/es-ES/BarcelonaJUG/events/271746564/&quot;&gt;https://www.meetup.com/es-ES/BarcelonaJUG/events/271746564/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The session runs for 45 min with Q and A at the end.&lt;br /&gt;
&lt;br /&gt;
PS: Just updated my platform to use latest Camel K 1.1.0 release, so hope the demo gods are on our side tomorrow.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/6012284122376998666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=6012284122376998666' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/6012284122376998666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/6012284122376998666'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/07/barcelonajug-talk-on-tuesday-july-28th.html' title='BarcelonaJUG talk on Tuesday July 28th about Camel 3 in the era of Kubernetes and Serverless'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-n-qFXEoQCPU/Xx7mxK1FBjI/AAAAAAAACOc/MfwGlrxLrBkhtZPWrHQBjhHgF1sOtHdCgCLcBGAsYHQ/s72-c/barca-jug.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-2580999165784274908</id><published>2020-06-10T14:51:00.000+02:00</published><updated>2020-06-10T14:51:41.966+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="camelk"/><category scheme="http://www.blogger.com/atom/ns#" term="release"/><title type='text'>Apache Camel K 1.0 is here - Why should you care</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Yesterday we released Apache Camel K 1.0 and it was announced on social media and on the Camel website.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-pR00B9yyG-A/XuDPVAWVljI/AAAAAAAACL8/34TAMqn0VHcI_zUi8bhP5-P3cGmxijTdwCLcBGAsYHQ/s1600/Screenshot%2B2020-06-09%2Bat%2B20.46.38.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;426&quot; data-original-width=&quot;1169&quot; height=&quot;145&quot; src=&quot;https://1.bp.blogspot.com/-pR00B9yyG-A/XuDPVAWVljI/AAAAAAAACL8/34TAMqn0VHcI_zUi8bhP5-P3cGmxijTdwCLcBGAsYHQ/s400/Screenshot%2B2020-06-09%2Bat%2B20.46.38.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
So what is Camel K and why should you care? That is a great question and I want to help answer this by referring to great minds.&lt;br /&gt;
&lt;br /&gt;
Hugo Guerrero posted the &lt;a href=&quot;https://twitter.com/hguerreroo/status/1270471245813907463?s=20&quot;&gt;following tweet&lt;/a&gt; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://twitter.com/hguerreroo/status/1270471245813907463?s=20&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;107&quot; data-original-width=&quot;559&quot; height=&quot;76&quot; src=&quot;https://1.bp.blogspot.com/-_iQRpqOkJBc/XuDQJpydziI/AAAAAAAACMI/_EhBEuh64CMERITk98fi2LOFKjMHFBB4ACLcBGAsYHQ/s400/Screenshot%2B2020-06-10%2Bat%2B14.16.25.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
That is a powerful statement from Hugo, where he highlights the groundbreaking innovation from Camel K, that gives developers the tools and means to build Java based services that are both serverless and functional and runs using standard Kubernetes building blocks.&lt;br /&gt;
&lt;br /&gt;
Camel K is the biggest innovation in Apache Camel for the last 10 years. So fill your cup with coffee or tea, and sit back and enjoy the next 10 minutes read.&lt;br /&gt;
&lt;br /&gt;
I give the floor to Nicola Ferraro (co-creator of Camel K) whom have allowed me to re-post his blog post from the announcement yesterday.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Apache Camel K has made a lot of progress since its inception and we&#39;re now proud to announce the 1.0 release. We&#39;ve been working hard in the past months to add more awesome features to Camel K, but also to improve stability and performance. This post contains a list of cool stuff that you&#39;ll find in the 1.0 GA release.&lt;br /&gt;
&lt;br /&gt;
First of all, if you&#39;re living under a rock and it&#39;s the first time you hear about Camel K,&lt;br /&gt;
you can read some introductory blog posts here (&lt;a href=&quot;https://nicolaferraro.me/2018/10/15/introducing-camel-k/&quot;&gt;1 - introducing Camel K&lt;/a&gt;) (&lt;a href=&quot;https://www.nicolaferraro.me/2018/12/10/camel-k-on-knative&quot;&gt;2 - camel k on knative&lt;/a&gt;)&lt;br /&gt;
or look at the Apache Camel website that contains a &lt;a href=&quot;https://camel.apache.org/camel-k/latest/&quot;&gt;Camel K section&lt;/a&gt;&lt;br /&gt;
with a lot of material that is automatically generated from the &lt;a href=&quot;https://github.com/apache/camel-k&quot;&gt;Github repository&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;User experience&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Camel K development style is minimalistic: you need just to write a single file with your integration routes and you can immediately run them on any Kubernetes cluster. This way of defining things is common to many FaaS platforms (although Camel K is not a proper FaaS platform, but a lightweight integration platform) and it&#39;s technically difficult to provide IDE support, such as code completion and other utilities, to developers.&lt;br /&gt;
&lt;br /&gt;
But now we&#39;ve it. The integration tooling team has created some cool extensions for VS Code that make the development experience with Camel K even more exciting.&lt;br /&gt;
You don&#39;t need to remember the Camel DSL syntax, the IDE will give you suggestions and error highlighting.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-K_G7PxgJl_c/XuDSh87YHRI/AAAAAAAACMU/XR9vouL-2dUa98TMnV9stsC8PFyYyLNqACLcBGAsYHQ/s1600/ide-autocompletion.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;563&quot; data-original-width=&quot;852&quot; height=&quot;263&quot; src=&quot;https://1.bp.blogspot.com/-K_G7PxgJl_c/XuDSh87YHRI/AAAAAAAACMU/XR9vouL-2dUa98TMnV9stsC8PFyYyLNqACLcBGAsYHQ/s400/ide-autocompletion.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Code completion works with Java code, but it&#39;s not only limited to it: you also have suggestions and documentation out of the box when writing the Camel URIs and property files.&lt;br /&gt;
And you also have many options to run integrations and interact with them, all integrated in the IDE.&lt;br /&gt;
&lt;br /&gt;
Just install the VS Code &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=redhat.apache-camel-extension-pack&quot;&gt;Extension Pack for Apache Camel&lt;/a&gt;&amp;nbsp;to have all these features available.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Getting started tutorials&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Good tools are fundamental to have a great development experience with Camel K, but then you need to learn what you can do with such a great power.&lt;br /&gt;
We&#39;ve created a new repository in the Apache organization that hosts getting started examples: the &lt;a href=&quot;https://github.com/apache/camel-k-examples&quot;&gt;camel-k-examples&lt;/a&gt; repository.&lt;br /&gt;
&lt;br /&gt;
So far we&#39;ve added guides that drive you through:&lt;br /&gt;
&lt;br /&gt;
- &lt;a href=&quot;https://github.com/apache/camel-k-examples/tree/master/01-basic&quot;&gt;01 Basic&lt;/a&gt;: Learn the basics of Camel K and some interesting use cases&lt;br /&gt;
- &lt;a href=&quot;https://github.com/apache/camel-k-examples/tree/master/02-serverless-api&quot;&gt;02 Serverless APIs&lt;/a&gt;: How to design a serverless (i.e. auto-scaling, scaling to zero) API and run it in a few minutes&lt;br /&gt;
&lt;br /&gt;
The basic quickstart is &lt;a href=&quot;https://learn.openshift.com/middleware/courses/middleware-camelk/camel-k-basic&quot;&gt;also available online&lt;/a&gt;, so you can have a look at how camel k works &lt;b&gt;without installing anything on your laptop&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
More tutorials are expected to come in the following months. You are also welcome if you want to help us by contributing your own. They are based on the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=redhat.vscode-didact&quot;&gt;VSCode Didact&lt;/a&gt; project, that provides an&lt;br /&gt;
awesome user experience.&lt;br /&gt;
&lt;br /&gt;
If you are looking for Camel K code samples that you can just pick and run using the CLI, the &lt;a href=&quot;https://github.com/apache/camel-k/tree/master/examples&quot;&gt;examples directory&lt;/a&gt;&amp;nbsp;of the Camel K main repository contains a lot of them. You can also run them directly from Github:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;kamel run https://raw.githubusercontent.com/apache/camel-k/master/examples/Sample.java&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
You can find ready-to-use examples written in different languages (e.g. &lt;a href=&quot;https://github.com/apache/camel-k/blob/5fb589090c2f45b28aef586118df48fad8838b3f/examples/hello.xml&quot;&gt;XML&lt;/a&gt;, &lt;a href=&quot;https://github.com/apache/camel-k/blob/5fb589090c2f45b28aef586118df48fad8838b3f/examples/simple.js&quot;&gt;JavaScript&lt;/a&gt; and others).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Serverless&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Serverless is the most important area where we&#39;re focusing the new developments in Apache Camel K, although, you should remember, you can have a wonderful Camel K experience even without serverless features. To enable the serverless profile in Camel K, you just need to have &lt;a href=&quot;https://knative.dev/&quot;&gt;Knative&lt;/a&gt; installed.&lt;br /&gt;
&lt;br /&gt;
In recent releases, we have added support for the most recent advancements in Knative, for example, Camel K is very well integrated with the Knative event broker and you can easily produce or consume events from it.&lt;br /&gt;
&lt;br /&gt;
With &lt;b&gt;2 lines of code&lt;/b&gt; you can transfer events (e.g. generated by IoT devices) from your MQTT broker to the mesh:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;bridge.groovy&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;from(&#39;paho:mytopic?brokerUrl=tcp://broker-address:1883&amp;amp;clientId=knative-bridge&#39;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; .to(&#39;knative:event/device-event&#39;)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No kidding, you just need to write those two lines of code in a file and run it with &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;kamel run bridge.groovy&lt;/span&gt; to push data into the Knative broker.&lt;br /&gt;
&lt;br /&gt;
And you can also scale the Integration out (Integration is a Kubernetes custom resource, &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;kubectl get integrations&lt;/span&gt; to see all of them)&lt;br /&gt;
to have a higher throughput. Scaling here is manual because the source of events is a MQTT broker (but we&#39;ve plans to put &lt;a href=&quot;https://github.com/apache/camel-k/issues/1107)&quot;&gt;auto-scaling also in this scenario&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The Camel K embedded auto-scaling feature works really well when you want to react to some Knative events:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;listener.groovy&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;from(&#39;knative:event/device-event&#39;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; .to(&#39;http://myhost/webhook/random-id&#39;)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
This integration is configured to receive all events with `type=device-event` and scales automatically with the load because it is materialized into a &lt;a href=&quot;https://knative.dev/docs/serving/spec/knative-api-specification-1.0/#service&quot;&gt;Knative Serving Service&lt;/a&gt;&amp;nbsp;and automatically subscribed to the &lt;a href=&quot;https://knative.dev/docs/eventing/broker/&quot;&gt;Eventing Broker&lt;/a&gt; via a Trigger.&lt;br /&gt;
&lt;br /&gt;
It then receives a &lt;a href=&quot;https://cloudevents.io/&quot;&gt;CloudEvent&lt;/a&gt; when your IoT devices produce something and scales down to zero if there&#39;s no data coming. You just need to create it (as before, just &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;kamel run listener.groovy&lt;/span&gt;), all the remaining configuration is done &lt;b&gt;automatically by the Camel K operator&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
We&#39;ve added much more features for having a better integration with the Knative ecosystem and we&#39;ve also fixed some compatibility and performance issues that were present in previous versions. The user experience is now much smoother.&lt;br /&gt;
&lt;br /&gt;
If you are a Knative YAML developer (!), instead of using Camel K directly, you also have the option to use &lt;a href=&quot;https://knative.dev/docs/eventing/samples/apache-camel-source/&quot;&gt;Knative Camel Sources&lt;/a&gt; which are part of the Knative release. They are wrappers for Camel K integrations that are compatible with all the tools used by Knative developers (such as the kn CLI or the OpenShift serverless console).&lt;br /&gt;
Sources in Knative can only push data into the various Knative endpoints, but not the other way around (i.e. they cannot be used to publish data from Knative to the outside).&lt;br /&gt;
In Camel K you don&#39;t have this limitation: the Route is the fundamental building block of a Camel integration and you can do whatever you want with it.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Fast startup and low memory&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
We cannot say we&#39;re serverless without mentioning the work that we&#39;ve been doing in improving the performance of Camel K integrations.&lt;br /&gt;
&lt;br /&gt;
Starting from Camel 3.3.0 which is the default version used by Camel K 1.0.0, you can benefit from all improvements that have been made directly in the Camel core to make it much more lightweight. More in depth details of the Camel core improvements can be found the following blog series that highlights what has been changed in the 3.x Camel timeline to reduce memory footprint and speedup the startup time, which is fundamental when running integrations in a serverless environment: &lt;a href=&quot;http://www.davsclaus.com/2020/01/apache-camel-31-more-camel-core.html?m=1&quot;&gt;part 1&lt;/a&gt;, &lt;a href=&quot;http://www.davsclaus.com/2020/01/apache-camel-31-more-camel-core_30.html?m=1&quot;&gt;part 2&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;http://www.davsclaus.com/2020/02/apache-camel-31-more-camel-core.html?m=1&quot;&gt;part 3&lt;/a&gt;, &lt;a href=&quot;http://www.davsclaus.com/2020/03/apache-camel-32-reflection-free.html?m=1&quot;&gt;part 4&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
But improvements are not only limited to the Camel core: we&#39;re doing much more. Several months ago we&#39;ve started a new subproject of Apache Camel named &lt;a href=&quot;https://github.com/apache/camel-quarkus&quot;&gt;Camel Quarkus&lt;/a&gt; with the goal of seamlessly running integrations on top of the Quarkus framework. As you probably know, Quarkus is able to reduce the memory footprint of Java applications and improve the startup time, because it moves much startup logic to the build phase. And Quarkus applications can also be compiled to a native binary, allowing a dramatic improvements in startup performance and very low memory footprint.&lt;br /&gt;
&lt;br /&gt;
In Camel K 1.0.0 we support Camel Quarkus in JVM mode. A goal is to have also the in-cluster native compilation soon (for some DSL languages, such as YAML), in one of next releases!&lt;br /&gt;
&lt;br /&gt;
To use Quarkus as underlying runtime, you just need to enable the &lt;a href=&quot;https://camel.apache.org/camel-k/latest/traits/quarkus.html&quot;&gt;Quarkus trait&lt;/a&gt; when running an integration:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;kamel run myintegration.groovy -t quarkus.enabled=true&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Quarkus is expected to be the default underlying runtime in the next release, and support for Standalone mode (via camel-main) will be deprecated and removed. This means that you won&#39;t need to enable Quarkus manually in the next releases, but you still need to do it in 1.0.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Fast build time&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Every application running on Kubernetes needs to be packaged in a container image, but in Camel K you only provide the integration DSL and the operator does what it takes to run it, including building images directly in the cluster.&lt;br /&gt;
&lt;br /&gt;
The operator manages a pool of reusable container images and if you redeploy your integration code, it does try to reuse existing images from the pool rather than building a new one at each change, because it takes some time to build a new one. It was 1 minute at the beginning...&lt;br /&gt;
&lt;br /&gt;
But Kubernetes is moving so fast that you cannot solve a problem once and forget about it, you need to take care of it continuously. It happened that some of our third party dependencies that we used for doing builds in &quot;vanilla Kube&quot; has slowly degraded in performance up to a point where Camel K user experience was highly affected.&lt;br /&gt;
&lt;br /&gt;
We decided to work harder on the build system in order to dramatically improve (again!) the build phase of Camel K integrations.&lt;br /&gt;
&lt;br /&gt;
Build time can be be now measured in seconds in dev environments such as Minikube. A bunch of seconds, most of the times. This is more than a simple improvement!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Better CLI&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The &#39;kamel&#39; CLI is the main tool we provide to developers to run integrations. It&#39;s not a mandatory requirement: at the end, an Integration is a Kubernetes custom resources and you can manage it with any Kubernetes standard tool (e.g. kubectl). But the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;kamel&lt;/span&gt; CLI adds a lot of value for integration developers.&lt;br /&gt;
&lt;br /&gt;
For example, if you&#39;re a Camel Java developer it&#39;s not super easy to remember the boilerplate that you have to write in order to instantiate a Camel route builder. Now you don&#39;t have to remember that:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;kamel init Handler.java&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
You get a Java file with all the boilerplate written for you and you just have to write your integration routes.&lt;br /&gt;
&lt;br /&gt;
It works also with all other languages: Groovy, XML, YAML, Kotlin and JavaScript.&lt;br /&gt;
For example you can write:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;kamel init foo.js&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This way you get a simple route written in JavaScript.&lt;br /&gt;
&lt;br /&gt;
It&#39;s not just that. Often Camel K developers need to add a lot of command line options to configure the final behavior of their integration. For example, you may want to add a custom library with the `-d` option or configure a trait with `-t`. E.g.:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;kamel run -d mvn:org.my:lib:1.0.0 -d mvn:org.my:otherlib:2.0.0 -t quarkus.enabled=true Handler.java&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sometimes the number of command line parameters you&#39;ve to add can become too many. For this reason we&#39;ve added the possibility to specify them as modeline options in the integration file (done by adding a comment line with `camel-k:` as prefix).&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Handler.java&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;// camel-k: dependency=mvn:org.my:lib:1.0.0 dependency=mvn:org.my:otherlib:2.0.0 trait=quarkus.enabled=true&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;// ...&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;// your routes here&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once the options are written in the file, you can run the routes with just:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;// simply this, additional args are read from the file&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;kamel run Handler.java&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The other options are taken automatically from the file modeline. The CLI also displays the full command to let you know what&#39;s running.&lt;br /&gt;
&lt;br /&gt;
This kind of configuration is extremely useful in CI/CD scenarios because it allows you to have self-contained integration files and you don&#39;t need to change the pipeline to setup additional options. If you&#39;re curious about the CI/CD configurations, you can follow the &lt;a href=&quot;https://camel.apache.org/camel-k/latest/tutorials/tekton/tekton.html&quot;&gt;tutorial about Tekton pipelines&lt;/a&gt; to have more information.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Monitoring and Tracing&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Ok, you&#39;ve finished level 1 of Camel K development and you want to make serious things. You&#39;re in a very good position because Camel K provides a lot of useful tools to add visibility on what your integration routes are doing.&lt;br /&gt;
&lt;br /&gt;
Let&#39;s suppose you&#39;ve a &lt;a href=&quot;https://prometheus.io/&quot;&gt;Prometheus&lt;/a&gt;&amp;nbsp;instance in your namespace and you want to publish your integration metrics:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;kamel run Routes.java -t prometheus.enabled=true&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
That&#39;s it. No need to setup services a labels to enable scraping. A default prometheus configuration file is also provided for the integration, with sensible defaults. Of course you also have the option to provide &lt;a href=&quot;https://camel.apache.org/camel-k/latest/traits/prometheus.html&quot;&gt;your own configuration&lt;/a&gt; for advanced use cases.&lt;br /&gt;
&lt;br /&gt;
Now, let&#39;s suppose you want to see what your routes are doing and trace the execution flow of an integration. What you need to do is to install an opentracing compatible application in the namespace, such as &lt;a href=&quot;https://www.jaegertracing.io/&quot;&gt;Jaeger&lt;/a&gt;, and run the integration as:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;kamel run Routes.java -t prometheus.enabled=true -t tracing.enabled=true&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
That&#39;s it again. The Camel K operator will add the &lt;a href=&quot;https://camel.apache.org/components/latest/others/opentracing.html&quot;&gt;camel-opentracing&lt;/a&gt; library and connect it to the Jaeger collector that is available in the namespace. Here again, &lt;a href=&quot;https://camel.apache.org/camel-k/latest/traits/tracing.html&quot;&gt;advanced use cases&lt;/a&gt; are supported.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Master routes&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Good old Camel users know why and when master routes are useful, but for those who are not familiar with the term, I&#39;m going to provide a brief explanation.&lt;br /&gt;
&lt;br /&gt;
Whenever you have an integration route that must be running, at any point in time, in at most one single Camel instance, you need to use a master route. Master routes can be declared by simply prefixing the consumer endpoint by the &#39;master&#39; keyword and a name that will be used to create a named lock, e.g.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;from(&#39;master:mylock:telegram:bots&#39;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; .to(&#39;log:info&#39;)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It can be used to print all messages that are sent to your Telegram bot. Since the Telegram API support a single consumer only, you can guard the route with a master prefix to have the guarantee that there will be at most only one consumer at any given time.&lt;br /&gt;
&lt;br /&gt;
If you&#39;re wondering how there can be two instances running of you deploy one, well, think just to when you change your code and need to do a rolling update: for some time there&#39;ll be two pods running in parallel. In some cases, you may decide to scale your service out but keep only one instance of a particular route among all the pods of your service. Or you may want to embed a master route in a Knative autoscaling service: in this case, the service can scale autonomously based on the load, but there&#39;ll be only one telegram consumer at any time.&lt;br /&gt;
&lt;br /&gt;
Master routes work out of the box in Camel K, you just need to put a prefix in your endpoint uri. A leader election protocol based on Kubernetes APIs resource locks will be automatically configured for you!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;CronJobs&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
All complex enough systems contain several scheduled jobs. This is especially true for that part of the system that handles integration with the outside.&lt;br /&gt;
&lt;br /&gt;
Ideally, if you need to execute a quick periodic task, say, every two seconds, you would startup an integration with a route based on timer to execute the periodic task. E.g.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;from(&quot;timer:task?period=2000&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; .to(this, &quot;businessLogic&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
But if the period between two executions, instead of 2 seconds (&quot;2000&quot; in the Camel URI, which is measured in milliseconds) is 2 minutes (&quot;120000&quot;) or 2 hours (&quot;7200000&quot;)?&lt;br /&gt;
&lt;br /&gt;
You can see that keeping a container with a JVM running for a task that should be executed once every two minutes may be overkill (it is overkill for sure when the period is 2 hours). We live in a time where resources such as memory and CPU are really valuable.&lt;br /&gt;
&lt;br /&gt;
So the Camel K operator automatically handles this situation by deploying your integration not as a Kubernetes deployment, but as a Kubernetes CronJob. This saves a lot of resources, especially when the period between executions is high. When it&#39;s time to run your integration code, a container starts, triggers the execution and then gracefully terminates. Everything is handled automatically by Camel K and Kubernetes.&lt;br /&gt;
&lt;br /&gt;
There are cases when you don&#39;t want this feature to be enabled, for example, when your code makes use of in memory caches that is better to keep between executions. In these cases, you can safely turn off the feature by passing the flag `-t cron.enabled=false` to the `kamel run` command.&lt;br /&gt;
&lt;br /&gt;
The Cron feature does not only work with the `timer` component. We&#39;ve also added a &lt;a href=&quot;https://camel.apache.org/components/latest/cron-component.html&quot;&gt;cron component&lt;/a&gt; since Camel 3.1 that works really well in combination with the &lt;a href=&quot;https://camel.apache.org/camel-k/latest/traits/cron.html&quot;&gt;cron trait&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
So you can also write the cron expression in the route directly:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;from(&quot;cron:job?schedule=0/5+*+*+*+?&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; .to(this, &quot;businessLogic&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
In this case, a new pod with a JVM is started every 5 minutes to execute your scheduled task. For the remaining 4+ minutes you don&#39;t use any resource.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Transparency&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Camel K does a lot of work for you when you run your integration code in the cluster and it&#39;s possible that you put some errors in the code that can block the deployment process. We&#39;ve added a lot of visibility on the deployment process that now communicates with the users via Kubernetes events that are printed to the console when you use the CLI.&lt;br /&gt;
&lt;br /&gt;
This way you&#39;re always notified of problems in the code and you can better understand what to fix to make your integration run.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;How to try Camel K 1.0&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The first step is to go to the &lt;a href=&quot;https://dist.apache.org/repos/dist/release/camel/camel-k/1.0.0/&quot;&gt;Apache Camel K release page&lt;/a&gt;, download the kamel CLI for your OS and put it in your system path.&lt;br /&gt;
&lt;br /&gt;
Installation is done usually using the `kamel install` command, but, depending on the kind of Kubernetes cluster you&#39;re using, you may need to execute additional configuration steps.&lt;br /&gt;
The Camel K documentation contains a section about &lt;a href=&quot;https://camel.apache.org/camel-k/latest/installation/installation.html&quot;&gt;installing it on various types of Kubernetes clusters&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
If you have trouble or you need to install it on a particular cluster that is not listed, just reach out in the &lt;a href=&quot;https://gitter.im/apache/camel-k&quot;&gt;Gitter chat&lt;/a&gt; and we&#39;ll do our best to help you.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Future&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
We&#39;ve reached version 1.0.0 and this is a great milestone for us. But we are not going to stop now: we&#39;ve big plans for the future and we&#39;ll continue to develop awesome new features.&lt;br /&gt;
&lt;br /&gt;
We need your help to improve Camel K and we love contributions!&lt;br /&gt;
&lt;br /&gt;
Join us on:&lt;br /&gt;
&lt;br /&gt;
- Gitter: &lt;a href=&quot;https://gitter.im/apache/camel-k&quot;&gt;https://gitter.im/apache/camel-k&lt;/a&gt;&lt;br /&gt;
- GitHub: &lt;a href=&quot;https://github.com/apache/camel-k&quot;&gt;https://github.com/apache/camel-k&lt;/a&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/2580999165784274908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=2580999165784274908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/2580999165784274908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/2580999165784274908'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/06/apache-camel-k-10-is-here-why-should.html' title='Apache Camel K 1.0 is here - Why should you care'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-pR00B9yyG-A/XuDPVAWVljI/AAAAAAAACL8/34TAMqn0VHcI_zUi8bhP5-P3cGmxijTdwCLcBGAsYHQ/s72-c/Screenshot%2B2020-06-09%2Bat%2B20.46.38.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-1123109473200841763</id><published>2020-06-04T10:16:00.001+02:00</published><updated>2020-06-04T10:16:44.888+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="presentation"/><category scheme="http://www.blogger.com/atom/ns#" term="webinar"/><title type='text'>Tech Talk tomorrow (friday) - What&#39;s new with Apache Camel 3?</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
This blog is with short noice. Tomorrow on Friday June 5th there will be a DevNation Tech Talk with Andrea Cosentino and myself presenting Apache Camel 3.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://developers.redhat.com/devnation/tech-talks/apache-camel-3/?sc_cid=7013a000002DYICAA4&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;104&quot; data-original-width=&quot;430&quot; height=&quot;77&quot; src=&quot;https://1.bp.blogspot.com/-6mEuwyCEBr0/XtitPb63e6I/AAAAAAAACLQ/umIMX9AWZ68VMXm4390lR51-CjkiUruIwCLcBGAsYHQ/s320/devnation-tech-talks-FINAL_1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Date: June 5, 2020&lt;br /&gt;
Time: 13:00 UTC / 15:00 CET / 9:00 AM EDT&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://camel.apache.org/&quot;&gt;Apache Camel&lt;/a&gt; is a leading open source integration framework that has been around for more than a decade.&lt;br /&gt;
&lt;br /&gt;
With the release of Apache Camel 3, the Camel family has been extended to include a full range of projects that are tailored to popular platforms including Spring Boot, Quarkus, Kafka, Kubernetes, and others; creating an ecosystem.&lt;br /&gt;
&lt;br /&gt;
Join this webinar to learn what’s new in Camel 3 and about Camel projects:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Latest features in Camel 3&lt;/li&gt;
&lt;li&gt;Quick demos of Camel 3, Camel Quarkus, Camel K, and Camel Kafka Connector&lt;/li&gt;
&lt;li&gt;Present insights into what&#39;s coming next&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;a href=&quot;https://developers.redhat.com/devnation/tech-talks/apache-camel-3/?sc_cid=7013a000002DYICAA4&quot;&gt;Registration required at following link&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/1123109473200841763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=1123109473200841763' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/1123109473200841763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/1123109473200841763'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/06/tech-talk-tomorrow-friday-whats-new.html' title='Tech Talk tomorrow (friday) - What&#39;s new with Apache Camel 3?'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-6mEuwyCEBr0/XtitPb63e6I/AAAAAAAACLQ/umIMX9AWZ68VMXm4390lR51-CjkiUruIwCLcBGAsYHQ/s72-c/devnation-tech-talks-FINAL_1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-157668072404510967</id><published>2020-04-24T09:38:00.000+02:00</published><updated>2020-04-24T09:38:10.719+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="book"/><category scheme="http://www.blogger.com/atom/ns#" term="camelk"/><category scheme="http://www.blogger.com/atom/ns#" term="knative"/><category scheme="http://www.blogger.com/atom/ns#" term="webinar"/><title type='text'>Free book on Knative covering Camel K and Kafka and upcoming webinar with live demos</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I want to say my congratulations to two of my fellow red hatters, Burr Sutter &amp;amp; Kamesh Sampath whom have published a new book on Knative - &lt;a href=&quot;https://dn.dev/knative-cookbook&quot;&gt;Knative Cookbook&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://dn.dev/knative-cookbook&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;875&quot; data-original-width=&quot;665&quot; height=&quot;320&quot; src=&quot;https://1.bp.blogspot.com/-ehd576weCIc/XqKWlik09xI/AAAAAAAACJg/TSFkWM_COjYizZUNZgJK4gdnUoUmdSY-wCLcBGAsYHQ/s320/unnamed.png&quot; width=&quot;243&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Blog post announcement:&amp;nbsp;&lt;a href=&quot;https://developers.redhat.com/blog/2020/04/23/knative-cookbook-building-effective-serverless-applications-with-kubernetes-and-openshift/&quot;&gt;book launch&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The book is around 150 pages and is a cookbook style, so it&#39;s a great learner book and with step by step instructions to try out first hand.&lt;br /&gt;
&lt;br /&gt;
The book has a chapter on Apache Camel K which is fantastic. They show you how to get started with Camel K and then continue to add Knative into the mix and how Camel K easily adapts to Knative being present in the platform.&lt;br /&gt;
&lt;br /&gt;
Kamesh will show all the greatness of Knative together with Kafka and Kamel, in his upcoming&amp;nbsp; webinar:&amp;nbsp;&lt;a href=&quot;https://developers.redhat.com/devnation/tech-talks/4K-Kubernetes-with-Knative-Kafka-and-Kamel/&quot;&gt;4K Kubernetes with Knative, Kafka, and Kamel&lt;/a&gt; scheduled at April 30th. So this is a great opportunity to hear first hand from the author, and see live demos, and just relax with a cup of coffee/tea or maybe even a cold beer. I surely will do that, maybe all 3 ... or skip the tea ;)&lt;br /&gt;
&lt;br /&gt;
So I suggest to go &lt;a href=&quot;https://dn.dev/knative-cookbook&quot;&gt;download the free book&lt;/a&gt;, and &lt;a href=&quot;https://developers.redhat.com/devnation/tech-talks/4K-Kubernetes-with-Knative-Kafka-and-Kamel/&quot;&gt;register for the webinar&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/157668072404510967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=157668072404510967' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/157668072404510967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/157668072404510967'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/04/free-book-on-knative-covering-camel-k.html' title='Free book on Knative covering Camel K and Kafka and upcoming webinar with live demos'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-ehd576weCIc/XqKWlik09xI/AAAAAAAACJg/TSFkWM_COjYizZUNZgJK4gdnUoUmdSY-wCLcBGAsYHQ/s72-c/unnamed.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-7841444695571495388</id><published>2020-04-14T14:41:00.002+02:00</published><updated>2020-04-14T14:41:52.555+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="graalvm"/><category scheme="http://www.blogger.com/atom/ns#" term="quarkus"/><category scheme="http://www.blogger.com/atom/ns#" term="video"/><title type='text'>How to quickly run 100 Camels with Apache Camel, Quarkus and GraalVM</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Today I continue me practice on youtube and recorded a &lt;a href=&quot;https://www.youtube.com/watch?v=4lXSf8DBQkQ&quot;&gt;10 minute video&lt;/a&gt; on creating a new Camel and Quarkus project that includes Rest and HTTP services with health checks and metrics out of the box.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;iframe width=&quot;320&quot; height=&quot;266&quot; class=&quot;YOUTUBE-iframe-video&quot; data-thumbnail-src=&quot;https://i.ytimg.com/vi/4lXSf8DBQkQ/0.jpg&quot; src=&quot;https://www.youtube.com/embed/4lXSf8DBQkQ?feature=player_embedded&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;br /&gt;
Then comparing the memory usage of running the example in JVM mode vs native compiled with GraalVM. Then showing for the finale how to quickly run 100 instances of the example each on their own TCP port and how quick Camel are to startup and service the first requests faster than you can type and click.&lt;br /&gt;
&lt;br /&gt;
For this demo I am using Java 11, Apache Camel 3.2.0, Quarkus 1.3.2 and GaalVM CE 20.0.0. You can find the source code for the example at &lt;a href=&quot;https://github.com/apache/camel-quarkus/tree/master/examples/http-log&quot;&gt;camel-quarkus github&lt;/a&gt; with instructions how to try for yourself.&lt;br /&gt;
&lt;br /&gt;
We are working on reducing the binary image size for Camel 3.3, by eliminating more classes that GraalVM includes that are not necessary. And we also have an experiment with an alternative lightweight CamelContext that are non dynamic at runtime which can improve this further. And then GraalVM and Quarkus will of course also keep innovative and make it smaller and faster.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/7841444695571495388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=7841444695571495388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/7841444695571495388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/7841444695571495388'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/04/how-to-quickly-run-100-camels-with.html' title='How to quickly run 100 Camels with Apache Camel, Quarkus and GraalVM'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/4lXSf8DBQkQ/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-8577095694920257291</id><published>2020-03-25T09:36:00.000+01:00</published><updated>2020-03-25T09:36:32.414+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="presentation"/><category scheme="http://www.blogger.com/atom/ns#" term="video"/><title type='text'>Best Practices for Middleware and Integration Architecture Modernization with Apache Camel</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Yesterday I gave the following virtual talk at the &lt;a href=&quot;https://www.meetup.com/Stockholm-FullStack-SecDevOps-Engineering-Meetup/events/269204017/&quot;&gt;Stockholm Meetup&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Best Practices for Middleware and Integration Architecture Modernization with Apache Camel&lt;/b&gt;&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
What are important considerations when modernizing middleware and moving towards serverless and/or cloud native integration architectures? How can we make the most of flexible technologies such as Camel K, Kafka, Quarkus and OpenShift. Claus is working as project lead on Apache Camel and has extensive experience from open source product development.&lt;/blockquote&gt;
I thank the organizers Forefront Consulting for inviting me. Unfortunately there was a glitch with the talk yesterday. As I could not be in person then the talk was pre-recorded and was cut half way. So I promised to post a blog today and upload the talk to &lt;a href=&quot;https://www.youtube.com/watch?v=d1Hr78a7Lww&quot;&gt;youtube&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;iframe width=&quot;320&quot; height=&quot;266&quot; class=&quot;YOUTUBE-iframe-video&quot; data-thumbnail-src=&quot;https://i.ytimg.com/vi/d1Hr78a7Lww/0.jpg&quot; src=&quot;https://www.youtube.com/embed/d1Hr78a7Lww?feature=player_embedded&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;br /&gt;
The title and abstract of the talk was somewhat given to me, and so was the session length of 30 minutes. As I am so heavily invested in Apache Camel, then I focused the talk about Camel and its evolution over the last 10 years as introduction and then using the latest innovations from Camel K, Camel Quarkus and Camel Kafka Connectors as the meat of the talk, and with 3 demos.&lt;br /&gt;
&lt;br /&gt;
The talk can be &lt;a href=&quot;https://www.youtube.com/watch?v=d1Hr78a7Lww&quot;&gt;watched on youtube&lt;/a&gt; and the &lt;a href=&quot;https://www.slideshare.net/davsclaus/best-practices-for-middleware-and-integration-architecture-modernization-with-apache-camel&quot;&gt;slides are here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/8577095694920257291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=8577095694920257291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/8577095694920257291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/8577095694920257291'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/03/best-practices-for-middleware-and.html' title='Best Practices for Middleware and Integration Architecture Modernization with Apache Camel'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/d1Hr78a7Lww/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-4193594022989513293</id><published>2020-03-22T18:45:00.001+01:00</published><updated>2020-03-22T18:45:41.892+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="roadmap"/><title type='text'>Apache Camel 3.1 - Fast loading of XML routes</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
A feature that was added to Camel 3.1 is the ability to load XML routes much faster. This is part of the overall work we are doing on making Camel much smaller and faster.&lt;br /&gt;
&lt;br /&gt;
You may say ewww XML. But frankly there are many users of Camel that have built applications with XML for defining routes. In Camel 2.x then you would have to use Spring or OSGi Blueprint for XML routes which both are becoming heavy in modern cloud native world.&lt;br /&gt;
&lt;br /&gt;
In Camel 3 we have a standalone mode for Camel called camel-main. We use camel-main as a common way to bootstrap and configure Camel for standalone, camel-k, camel-quarkus, and for most parts of camel-spring-boot as well. This ensures an unified and consistent developer experience across those runtimes.&lt;br /&gt;
&lt;br /&gt;
Okay this is probably a topic for another blog post to dive into camel-main as a great runtime for quickly running ... just Camel.&lt;br /&gt;
&lt;br /&gt;
So what I wanted to say in this blog post is that we have made it possible to loading XML routes much quicker and with a lot less overhead. In Camel 2.x, and for Spring XML and Blueprint XML they rely on JAXP and JAXB which ... are heavy.&lt;br /&gt;
&lt;br /&gt;
So what we have done for Camel 3.1 is to source code generate a XML parser based on the Camel DSL. This means anything we do changes to the DSL then the parser is re-generated. The parser just uses standard Java so there are no additional 3rd party library dependencies.&lt;br /&gt;
&lt;br /&gt;
For loading XML routes in Camel we now have 2 parsers in the following JARs&lt;br /&gt;
&lt;br /&gt;
- &lt;b&gt;camel-xml-jaxb&lt;/b&gt;&amp;nbsp; &amp;nbsp;(traditional JAXB based as in Camel 2.x)&lt;br /&gt;
- &lt;b&gt;camel-xml-io&amp;nbsp;&lt;/b&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;(new fast and lightweight source code generated parsers)&lt;br /&gt;
&lt;br /&gt;
The example &lt;a href=&quot;https://github.com/apache/camel-examples/tree/master/examples/camel-example-main-xml&quot;&gt;camel-example-main-xml&lt;/a&gt; is setup to use the new parser. But you can try for yourself and switch to the jaxb parser by changing the JAR dependency.&lt;br /&gt;
&lt;br /&gt;
Lets see some numbers (note this is just a quick test on my laptop to run this example with the 2 XML parsers).&lt;br /&gt;
&lt;br /&gt;
camel-xml-jaxb: Loaded 1 (&lt;b&gt;808 millis&lt;/b&gt;) additional Camel XML routes from: routes/*.xml&lt;br /&gt;
camel-xml-io:&amp;nbsp;Loaded 1 (&lt;b&gt;76 millis&lt;/b&gt;) additional Camel XML routes from: routes/*.xml&lt;br /&gt;
&lt;br /&gt;
So the new parser is about 10 times faster (76 vs 808 millis).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-aBAzocQ7A-U/XnekHKgfSDI/AAAAAAAACHo/6npV4MOyjTIJxo-BuyNW8OaYG5tKK-TswCLcBGAsYHQ/s1600/xml-fast.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;170&quot; data-original-width=&quot;486&quot; height=&quot;138&quot; src=&quot;https://1.bp.blogspot.com/-aBAzocQ7A-U/XnekHKgfSDI/AAAAAAAACHo/6npV4MOyjTIJxo-BuyNW8OaYG5tKK-TswCLcBGAsYHQ/s400/xml-fast.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
By profiling the JVM we can see that there is a lot less classes loaded as well: 4734 vs 3892. And on top of that JAXB leaves more objects and classes around in the JVM that may or may not easily be garbage collected, and would also be using more cpu and memory during its parsing.&lt;br /&gt;
&lt;br /&gt;
And then on GraalVM then the new parser would be much quicker as you can avoid having the entire JAXB and JAXP API and implementation on the classpath and for the GraalVM compiler to crunch and compile. And speaking of GraalVM then we are working on some great improvements in the upcoming Camel 3.2 that should help reduce the image size and compilation, and allow to do more dead code elimination and whatnot to make Camel even more awesome. That&#39;s yet another topic for another blog post, so stay tuned.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/4193594022989513293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=4193594022989513293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/4193594022989513293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/4193594022989513293'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/03/apache-camel-31-fast-loading-of-xml.html' title='Apache Camel 3.1 - Fast loading of XML routes'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-aBAzocQ7A-U/XnekHKgfSDI/AAAAAAAACHo/6npV4MOyjTIJxo-BuyNW8OaYG5tKK-TswCLcBGAsYHQ/s72-c/xml-fast.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-170188690358907614</id><published>2020-03-22T10:37:00.003+01:00</published><updated>2020-03-22T10:37:34.861+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="roadmap"/><title type='text'>Apache Camel 3.2 - Reflection free configuration of Camel</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
At the Apache Camel project we are working towards the next upcoming Apache Camel 3.2.0 release, which is planned for next month.&lt;br /&gt;
&lt;br /&gt;
One of the ares we have worked hard on in Camel 3 is to make it smaller and faster. And one aspect of this is also configuration management. You can fully configure Camel in many ways and according to the 12 factor principles, to keep configuration separated from the application. A popular way to configure is to use properties files (eg application.properties) or in Kubernetes you can configure from config maps or environment variables as well.&lt;br /&gt;
&lt;br /&gt;
So we have gradually over Camel 3.0, 3.1 and now 3.2 made configuration faster. With the latest work we are now fully reflection free.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-6jK6piCIdsY/Xncw02SZu-I/AAAAAAAACHc/9jnfMfzDUUErCgbsMtEQ8pI0Vq7DTrFWQCLcBGAsYHQ/s1600/fast-camel.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;334&quot; data-original-width=&quot;600&quot; height=&quot;222&quot; src=&quot;https://1.bp.blogspot.com/-6jK6piCIdsY/Xncw02SZu-I/AAAAAAAACHc/9jnfMfzDUUErCgbsMtEQ8pI0Vq7DTrFWQCLcBGAsYHQ/s400/fast-camel.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Camel is capable of reporting when reflection based configuration are being used. Which can be configured with:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;# bean introspection to log reflection based configuration&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;camel.main.beanIntrospectionExtendedStatistics=true&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;camel.main.beanIntrospectionLoggingLevel=INFO&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
We have prepared the camel-example-main-tiny to report this. The numbers for Camel 3.0, 3.1, and 3.2 are as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Camel 3.0: BeanIntrospection invoked: 12 times&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Camel 3.1:&amp;nbsp;Stopping BeanIntrospection which was invoked: 11 times&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Camel 3.2:&amp;nbsp;Stopping BeanIntrospection which was invoked: 0 times&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
What this means is that you can fully configure all your Camel endpoints, components, routes, EIPs, data formats, languages, camel main, camel context, and whatnot, in declarative properties files etc and then at runtime all of this ends up invoking the actual setter methods on all these instances (ie just direct java method calls, no java.lang.reflect).&lt;br /&gt;
&lt;br /&gt;
This is possible because we source code generate &lt;b&gt;configurer&lt;/b&gt; classes based on what options are present. And these configurer classes are reflection free. There can be many options so it would be impossible to implement this by hand, see for example the &lt;a href=&quot;https://github.com/apache/camel/blob/master/components/camel-kafka/src/generated/java/org/apache/camel/component/kafka/KafkaEndpointConfigurer.java&quot;&gt;kafka endpoint configurer&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
And btw another feature coming in Camel 3.2 is that we made all of the components options available for configuration, before we didn&#39;t include nested configuration options. And if you do not like configuring in properties files, then we have type-safe component-dsl and &lt;a href=&quot;https://camel.apache.org/manual/latest/Endpoint-dsl.html&quot;&gt;endpoint-dsl&lt;/a&gt; as well.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/170188690358907614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=170188690358907614' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/170188690358907614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/170188690358907614'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/03/apache-camel-32-reflection-free.html' title='Apache Camel 3.2 - Reflection free configuration of Camel'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-6jK6piCIdsY/Xncw02SZu-I/AAAAAAAACHc/9jnfMfzDUUErCgbsMtEQ8pI0Vq7DTrFWQCLcBGAsYHQ/s72-c/fast-camel.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-3418271676632918420</id><published>2020-02-27T11:17:00.000+01:00</published><updated>2020-02-27T11:17:05.744+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="webinar"/><title type='text'>Upcoming Webinar - What&#39;s new in Apache Camel 3</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
On March 3rd, at 3pm CET (Central European Timezone) I will co-host, together with Andrea Cosentino, a webinar session for 1 hour, where we cover all the great new features that are in the Apache Camel v3 release.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://www.redhat.com/en/events/webinar/apache-camel-3-here-whats-new?sc_cid=7013a000002DMQhAAO&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;223&quot; data-original-width=&quot;691&quot; height=&quot;128&quot; src=&quot;https://1.bp.blogspot.com/-krFtYasaT7k/XleWhQqG-nI/AAAAAAAACF4/AjjTNFmVuvc8MguZzk6CQhegddBsendnQCLcBGAsYHQ/s400/camel3-is-here.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Andrea and I will cover in more details the high level goals of Apache Camel 3, and focus on the key elements about making Camel smaller, lighter, and faster for the cloud native world. So you will find details about what we have done internally to make this happen.&lt;br /&gt;
&lt;br /&gt;
We also cover and introduce Camel K, Camel Quarkus and Camel Kafka Connector where we have 4 live demos ready for you. And finally we present the roadmap for the upcoming releases.&lt;br /&gt;
&lt;br /&gt;
At the end we have Q&amp;amp;A session where we will assist and answer as many questions you may have.&lt;br /&gt;
&lt;br /&gt;
The webinar is free to attend, but requires registration, as the webinar is run by professional media company.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://www.redhat.com/en/events/webinar/apache-camel-3-here-whats-new?sc_cid=7013a000002DMQhAAO&quot;&gt;More details and registration here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
PS: Yes we will cover details up till the latest Camel 3.1 release which is going to be released today ;)&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/3418271676632918420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=3418271676632918420' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/3418271676632918420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/3418271676632918420'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/02/upcoming-webinar-whats-new-in-apache.html' title='Upcoming Webinar - What&#39;s new in Apache Camel 3'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-krFtYasaT7k/XleWhQqG-nI/AAAAAAAACF4/AjjTNFmVuvc8MguZzk6CQhegddBsendnQCLcBGAsYHQ/s72-c/camel3-is-here.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-148761639106663735</id><published>2020-02-12T15:05:00.004+01:00</published><updated>2020-02-12T15:05:48.149+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="roadmap"/><title type='text'>Apache Camel 3.1 - More camel-core optimizations coming (Part 3)</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I have previously blogged about the optimizations we are doing in the next Camel 3.1 release&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.davsclaus.com/2020/01/apache-camel-31-more-camel-core.html&quot;&gt;blog part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.davsclaus.com/2020/01/apache-camel-31-more-camel-core_30.html&quot;&gt;blog part 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Today I wanted to give a short update on the latest development we have done, as we are closing down on being ready to build and release Camel 3.1 as early as end of this week or the following.&lt;br /&gt;
&lt;br /&gt;
Since part 2, we managed to find additional 10% reduction on object allocations during routing.&lt;br /&gt;
&lt;br /&gt;
We have also continued the effort of configuring Camel via source code generated configurers that performs direct Java method calls vs using java bean reflections. Now all components, data formats, languages, and EIP patterns is complete. Only in more advanced use-cases where configuration is based on nested complex objects that are dynamically configured would be outside the scope of the source code configures and Camel fallback to use reflection.&lt;br /&gt;
&lt;br /&gt;
We also found a way to optimize property placeholder resolution on EIPs to avoid using source code generated configurers which means that there are 200 classes less to load on the classpath, and about 90kb of memory is saved. This is great as these classes and memory were only used during bootstrap of Camel, and now they are all gone.&lt;br /&gt;
&lt;br /&gt;
We also managed to further modulaize camel-core, so JAXB and XML routes are optional.&lt;br /&gt;
Even for XML routes (not Spring or Blueprint as they have their own DOM XML parser) we have created an alternative, fast and light-weight pull based parser. The camel-example-main-xml is using this and by comparing JAXB vs Camel XML then its 6x faster (approx 1500 millis vs 250) and loads 700 classes less than JAXB.&lt;br /&gt;
&lt;br /&gt;
However for non XML users (eg using Java DSL) then JAXB can be avoided on the classpath at all, and you can have tiny Camel applications, such as camel-example-main-tiny with the following dependency tree (&lt;b&gt;bold are Camel JARs;&amp;nbsp;&lt;/b&gt;the example uses the bean and timer components)&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] org.apache.camel.example:camel-example-main-tiny:jar:3.1.0-SNAPSHOT&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;[INFO] +- org.apache.camel:camel-main:jar:3.1.0-SNAPSHOT:compile&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;[INFO] |&amp;nbsp; +- org.apache.camel:camel-api:jar:3.1.0-SNAPSHOT:compile&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;[INFO] |&amp;nbsp; +- org.apache.camel:camel-base:jar:3.1.0-SNAPSHOT:compile&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;[INFO] |&amp;nbsp; +- org.apache.camel:camel-core-engine:jar:3.1.0-SNAPSHOT:compile&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;[INFO] |&amp;nbsp; +- org.apache.camel:camel-management-api:jar:3.1.0-SNAPSHOT:compile&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;[INFO] |&amp;nbsp; +- org.apache.camel:camel-support:jar:3.1.0-SNAPSHOT:compile&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;[INFO] |&amp;nbsp; \- org.apache.camel:camel-util:jar:3.1.0-SNAPSHOT:compile&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;[INFO] +- org.apache.camel:camel-bean:jar:3.1.0-SNAPSHOT:compile&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;[INFO] +- org.apache.camel:camel-timer:jar:3.1.0-SNAPSHOT:compile&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] +- org.apache.logging.log4j:log4j-api:jar:2.13.0:compile&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] +- ch.qos.logback:logback-core:jar:1.2.3:compile&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] \- ch.qos.logback:logback-classic:jar:1.2.3:compile&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO]&amp;nbsp; &amp;nbsp; \- org.slf4j:slf4j-api:jar:1.7.30:compile&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
I ran this example with the profiler and configured it to use 10MB as max heap (-Xmx10M) and as the summary shows this can easily be done. About 5mb is used in the heap.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-ps-KFiZPWX8/XkQFccKVD0I/AAAAAAAACFE/ow6g11f_y-MwkZlVJihHOy9lGsAJsnOAQCLcBGAsYHQ/s1600/10mb-heap.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;378&quot; data-original-width=&quot;959&quot; height=&quot;156&quot; src=&quot;https://1.bp.blogspot.com/-ps-KFiZPWX8/XkQFccKVD0I/AAAAAAAACFE/ow6g11f_y-MwkZlVJihHOy9lGsAJsnOAQCLcBGAsYHQ/s400/10mb-heap.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
There has also been a few other minor improvements to avoid using Camel 2.x based type converter scanning by default. This reduces a scan on the classpath.&lt;br /&gt;
&lt;br /&gt;
Okay its time to end this blog series and finish up the last bits so we can get Camel 3.1 released.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/148761639106663735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=148761639106663735' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/148761639106663735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/148761639106663735'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/02/apache-camel-31-more-camel-core.html' title='Apache Camel 3.1 - More camel-core optimizations coming (Part 3)'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-ps-KFiZPWX8/XkQFccKVD0I/AAAAAAAACFE/ow6g11f_y-MwkZlVJihHOy9lGsAJsnOAQCLcBGAsYHQ/s72-c/10mb-heap.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-7177294796489210469</id><published>2020-01-30T12:34:00.000+01:00</published><updated>2020-01-30T12:34:14.344+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="roadmap"/><title type='text'>Apache Camel 3.1 - More camel-core optimizations coming (Part 2)</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I have previously &lt;a href=&quot;http://www.davsclaus.com/2020/01/apache-camel-31-more-camel-core.html&quot;&gt;blogged about the optimizations we are doing in the next Camel 3.1 release (part 1)&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Today I wanted to post a status update on the progress we have made since, about 4 weeks later.&lt;br /&gt;
&lt;br /&gt;
We have focused on optimizing camel-core in three areas:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;unnecessary object allocations&lt;/li&gt;
&lt;li&gt;unnecessary method calls&lt;/li&gt;
&lt;li&gt;improve performance&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
In other words we are making Camel create less objects, calling fewer methods, and improving the performance during routing.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
To help identify these issues in camel-core we were using a simple Camel route:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;from timer:foo&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; to log:foo&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
And other times we focused on longer routes:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;from timer:foo&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; to log:foo1&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; to log:foo2&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; to log:foo3&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; to log:fooN&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
Or the focus on the bean component:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;from timer:foo&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; to bean:foo&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
And so on. We also added an option to the timer component to not include metadata so the message dont contain any body, headers or exchange properties. This allowed us to focus on the pure routing engine and its overhead.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So all together this has helped identify many smaller points for improvements that collectively gains a great win.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;b&gt;tl:dr - Show me the numbers&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Okay let&#39;s post some numbers first and then follow up with details what has been done.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;u&gt;&lt;b&gt;Object Allocations - (5 minute sampling)&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 2.25&amp;nbsp; &amp;nbsp; &amp;nbsp;2.9 M objects created&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 3.0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;55 M objects created&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 3.1&amp;nbsp; &amp;nbsp; &amp;nbsp; 1.8 M objects created&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Okay we have to admit that Camel 3.0 has an issue with excessive object allocations during routing. There are no memory leaks but it creates a lot of unnecessary objects. And I will get into details below why.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
However what is interesting is the gain between Camel 2.25 and 3.1 (40% less objects created).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;u&gt;&lt;b&gt;Method Calls - (5 minute sampling)&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 2.25&amp;nbsp; &amp;nbsp; &amp;nbsp;139 different Camel methods in use&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 3.0&amp;nbsp; &amp;nbsp; &amp;nbsp; 167 different Camel methods in use&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 3.1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;84 different Camel methods in use&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
The table above lists the number of methods from Camel that Camel calls during routing. The data does not include all the methods from the JDK. As we cannot optimize those, but we can optimize the Camel source code.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As you can see from the table we have improvement. Camel 3.1 uses less than half of 3.0, and 40% less than Camel 2.2.5.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;b&gt;Camel 3.0&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Okay so Camel 3.0 has a problem with using too much memory. A big reason is the new reactive executor which now executes each step in the routing via event looping, by handing over tasks to a queue and having workers that execute the tasks. So this handoff now requires creating additional objects and storing tasks in queue etc.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Some of the biggest wins was to avoid creating TRACE logging message which unfortunately was always created regardless if TRACE logging level was enabled. Another big win was to avoid creating toString representation of the route processes with child elements. Instead Camel now only output the id of the process which is a fast operation and dont allocate new objects.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Another problem was new code that are using java.util.stream. This is both a blessing and a curse (mostly a curse for fast code). So by using plain for loops, if structures, and avoiding java.util.stream in the critical parts of core routing engine we reduces object allocations.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Camel 3 is also highly modularised, and for example in Camel 2.x we had all classes in the same classpath and could use instanceof checks. So in Camel 3 we had some code that performed poorly doing these kind of checks (java util streams again).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Another problem was the reactive executor which was using a LinkedList as its queue. So if you have tasks going into the queue and workers processing them in the same pace, so the queue is empty/drained, then LinkedList performs poorly as it allocates/deallocates the object constantly. By switching to a ArrayQueue which has a pre-allocated size of 16 then there is always room in the queue for tasks and no allocation/deallocation happens.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
There are many more optimisations but those mentioned above where likely the biggest problems. Then a lot of smaller optimisations gained a lot combined.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Many smaller&amp;nbsp;optimisations&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The UUID generator of Camel is using a bit of string concat which costs. We have reduced the need for generating UUIDs in the message and unit of work so we only generate 1 per exchange.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The internal advices in the Camel routing engine (advice = before/after AOP). Some of these advices has state which they need to carry over from before to after, which means an object needs to be stored. Before we allocated an array for all advices even for those whom do not have state and thus storing a null. Now we only allocate the array with the exact number of advices that has state. (very small win, eg object[6] vs object[2] etc, but this happens per step in the Camel route, so it all adds up.). Another win was to avoid doing an AOP around UnitOfWork if it was not necessary from the internal routing processor. This avoids additional method calls and to allocate a callback object for the after task. As all of this happens for each step in the routing then its a good improvement.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Some of the most used EIPs has been optimized. For example &lt;to&gt; allows you to send the message to an endpoint using a different MEP (but this is rarely used). Now the EIP detects this and avoids creating a callback object for restoring the MEP. The pipeline EIP (eg when you do to -&amp;gt; to -&amp;gt; to) also has a little improvement to use an index counter instead of java.util.Iterator, as the latter allocates an extra object&lt;/to&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Camel also has a StopWatch that used a java.util.Date to store the time. This was optimized to use a long value.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Another improvement is the event notification. We now pre-calculate if its in use and avoid calling it all together for events related to routing messages. BTW in Camel 3.0 the event notifier was refactored to use Java 8 Supplier&#39;s and many fancy APIs but all of that created a lot of overhead. In Camel 3.1 we have restored the notifier to be like before in Camel 2.x and with additional optimisations.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So let me end this blog by saying that .... awesome. Camel 3.1 will use less memory, execute faster by not calling as many methods (mind that we may have had to move some code which was required to be called but doing this in a different way to avoid calling too many methods).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
One of the bigger changes in terms of touched source code was to switch from using an instance based logger in ServiceSupport (base class for many things in Camel), to use a static logger instance. This means that there will be less Logger objects created and it&#39;s also better practice.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Better performance&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Other improvements is that we have moved some of the internal state that Camel kept as exchange properties to fields on the Exchange directly. This avoids storing a key/value in the properties map, but we can use primitives like boolean, int etc. This also performs better as its faster to get a boolean via a getter than to lookup the value in a Map via a key.&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In fact in Camel 3.1 then during regular routing then Camel doesnt lookup any such state from exchange properties which means there is no method calls. There are still some state that are stored as exchange properties (some of those may be improved in the future, however most of these states are only used infrequently). What we have optimized is the state that are always checked and used during routing.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;u&gt;&lt;b&gt;Exchange getProperty(5 minute sampling)&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 2.25&amp;nbsp; &amp;nbsp; &amp;nbsp;572598&amp;nbsp; &amp;nbsp;getPropety(String)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 2.25&amp;nbsp; &amp;nbsp; &amp;nbsp;161502&amp;nbsp; &amp;nbsp;getPropety(String, Object)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 2.25&amp;nbsp; &amp;nbsp; &amp;nbsp;161502&amp;nbsp; &amp;nbsp;getPropety(String, Object, Class)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 2.25&amp;nbsp; &amp;nbsp; &amp;nbsp;141962&amp;nbsp; &amp;nbsp;getPropeties()&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 3.0&amp;nbsp; &amp;nbsp; &amp;nbsp; 574944&amp;nbsp; &amp;nbsp;getProperty(String)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 3.0&amp;nbsp; &amp;nbsp; &amp;nbsp; 167904&amp;nbsp; &amp;nbsp;getPropety(String, Object)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 3.0&amp;nbsp; &amp;nbsp; &amp;nbsp; 167904&amp;nbsp; &amp;nbsp;getPropety(String, Object, Class)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 3.0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;91584&amp;nbsp; &amp;nbsp;getPropeties()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 3.1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;getProperty(String)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 3.1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;getPropety(String, Object)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 3.1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;getPropety(String, Object, Class)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Camel 3.1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;getPropeties()&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As you can see Camel 2.25 and 3.0 lookup this state a lot. And in Camel 3.1 we have optimized this tremendously and there are no lookup at all - as said the state is stored on the Exchange as primitive types which the JDK can inline and execute really fast.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The screenshot below shows Camel 2.25 vs 3.1. (The screenshot for 3.1 is slightly outdated as it was from yesterday and we have optimised Camel since). See screenshot below:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-0WVTF5BHjBU/XjK-kB9iHCI/AAAAAAAACEQ/Ks4WHFp8KWghMqn2lOHue44pYDOFuy-DgCLcBGAsYHQ/s1600/count-225vs310.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;357&quot; data-original-width=&quot;1044&quot; height=&quot;217&quot; src=&quot;https://1.bp.blogspot.com/-0WVTF5BHjBU/XjK-kB9iHCI/AAAAAAAACEQ/Ks4WHFp8KWghMqn2lOHue44pYDOFuy-DgCLcBGAsYHQ/s640/count-225vs310.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Okay there are many other smaller optimizations and I am working on one currently as I write this blog. Okay let me end this blog, and save details for part 3.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/7177294796489210469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=7177294796489210469' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/7177294796489210469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/7177294796489210469'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/01/apache-camel-31-more-camel-core_30.html' title='Apache Camel 3.1 - More camel-core optimizations coming (Part 2)'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-0WVTF5BHjBU/XjK-kB9iHCI/AAAAAAAACEQ/Ks4WHFp8KWghMqn2lOHue44pYDOFuy-DgCLcBGAsYHQ/s72-c/count-225vs310.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-1213719806990399705</id><published>2020-01-03T20:27:00.003+01:00</published><updated>2020-01-03T20:27:53.522+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="roadmap"/><title type='text'>Apache Camel 3.1 - More camel-core optimizations coming</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Hope all is good and you had a safe entry into 2020.&amp;nbsp;&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The Camel team is already busy working on the next Camel 3.1 version. One of the goals is to continue optimize camel-core, and this time we have had some time to look into finding some hot spots in the routing engine.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
One of the aspects we have looked at is also the object allocations that occurs per message that Camel routes. The JVM itself is great at allocation objects and garbage collecting them when they are no longer in use. However there are room for improvements if you can identify a number of objects that is unnecessary per EIP in the route.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So today I found several of these by just running a basic Camel route that is&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;from(timer:foo?period=1&quot;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; .to(&quot;log:foo&quot;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Which basically routes 1000 messages per second. And prints each message to the log.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
One of the bigger culprits in object allocations turned out to be human logging for the reactive executor which logs at TRACE level. So by avoiding this we can reduce a great deal of allocations, and string building for logging messages.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Other aspects we have optimised is the to EIP (the most used EIP) which is now smarter in its startup to avoid creating caches that was not necessary. And this goes together with areas where we now lazy creates some features in Camel that were very rarely in use that would otherwise also setup and create some caches.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
We also identified as part of the Camel 3 work, then the LRUCache was not pre warmed up as early as before, which meant Camel would startup a bit slower than it otherwise are capable of. So by moving this warmup to an earlier phase then Camel can startup faster by doing concurrent work on startup until the LRUCache is warmed up (its caffeine cache that needs this).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The log component has also been optimised to reduce its object allocations which building the logging message.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So all together a great day and if we compare startup up a Camel 3.0.0 vs 3.1.0-SNAPSHOT with the Camel route as shown above, then we have an awesome reducing in object allocations per second (thanks to YourKit for profiler).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-55e6jIr9Pjg/Xg-UYHz51zI/AAAAAAAACDM/LEQdm-zH7cgcEiDk0dyrRK5rrgjhqNw7wCLcBGAsYHQ/s1600/300vs310.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;187&quot; data-original-width=&quot;1053&quot; height=&quot;70&quot; src=&quot;https://1.bp.blogspot.com/-55e6jIr9Pjg/Xg-UYHz51zI/AAAAAAAACDM/LEQdm-zH7cgcEiDk0dyrRK5rrgjhqNw7wCLcBGAsYHQ/s400/300vs310.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The profile says that in Camel 3.0.0 then Camel would roughly generate about 22.000 objects per second (routing 1000 messages). And that has been reduced to about 6.000 objects per second in Camel 3.1. That is fantastic, and is almost a 4x reduction.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/1213719806990399705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=1213719806990399705' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/1213719806990399705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/1213719806990399705'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2020/01/apache-camel-31-more-camel-core.html' title='Apache Camel 3.1 - More camel-core optimizations coming'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-55e6jIr9Pjg/Xg-UYHz51zI/AAAAAAAACDM/LEQdm-zH7cgcEiDk0dyrRK5rrgjhqNw7wCLcBGAsYHQ/s72-c/300vs310.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-4295262075055240094</id><published>2019-12-04T12:01:00.002+01:00</published><updated>2019-12-04T12:02:13.581+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="release"/><category scheme="http://www.blogger.com/atom/ns#" term="roadmap"/><title type='text'>Apache Camel 3 - Whats New Top 10</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Apache Camel 3 was released last thursday November 28th 2019, which also happens to be the day of the US Thanksgiving. This was not intentionally but we can say its a big thanks from us to the community with a brand new major version of Camel - this does not come by often. In fact it&#39;s 10 years since Camel 2 hit the streets. So this 3rd generation is long overdue.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://camel.apache.org/blog/Camel3-Whatsnew/camel3-3humps_hu7ba293cf525bac57712ef8f5199c56b4_332440_800x0_resize_q95_gaussian_2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;687&quot; data-original-width=&quot;800&quot; height=&quot;274&quot; src=&quot;https://camel.apache.org/blog/Camel3-Whatsnew/camel3-3humps_hu7ba293cf525bac57712ef8f5199c56b4_332440_800x0_resize_q95_gaussian_2.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This blog post highlights the noteworthy new features and improvements in Camel v3.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1) CAMEL IS NOW A FAMILY OF PROJECTS&lt;/b&gt;&lt;br /&gt;
Apache Camel, is now a family of projects (3 at this time of writing):&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/apache/camel&quot;&gt;Camel 3&lt;/a&gt;: Integration Framework Swiss knife of integration&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/apache/camel-k/&quot;&gt;Camel K&lt;/a&gt;: Lightweight Serverless Integration Platform Camel on Kubernetes &amp;amp; Knative&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/apache/camel-quarkus&quot;&gt;Camel Quarkus&lt;/a&gt;: Camel extensions for Quarkus Optimised JVM &amp;amp; Native compiled Java (GraalVM)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://camel.apache.org/blog/Camel3-Whatsnew/camel3-projects_hu14eb14882812af4ef4cf988ec2e12bd3_88043_800x0_resize_q95_gaussian_2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;338&quot; data-original-width=&quot;800&quot; height=&quot;168&quot; src=&quot;https://camel.apache.org/blog/Camel3-Whatsnew/camel3-projects_hu14eb14882812af4ef4cf988ec2e12bd3_88043_800x0_resize_q95_gaussian_2.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The Camel code-base is very large, and we have setup sub-projects for new innovative projects using Camel. The first sub-project was to run Camel as cloud-native on Kubernetes in a serverless manner which became Camel K. Then Camel Quarkus came to make Java and Camel with very fast startup and very small memory footprint primary for container based deployments.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2) NEW WEBSITE&lt;/b&gt;&lt;br /&gt;
A major goal for Camel 3 was to finally revamp the old aging website to use modern technologies and be able to auto-generate content from the source code. This has taken years to get to this point as we have built tools over the last many Camel 2.x releases that could take us closer. At end of 2019 then the Camel community and others stepped up and provided the new art-work, logo, and look and feel for the new website - thank you very much!.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://camel.apache.org/blog/Camel3-Whatsnew/camel3-website.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;372&quot; data-original-width=&quot;800&quot; height=&quot;185&quot; src=&quot;https://camel.apache.org/blog/Camel3-Whatsnew/camel3-website.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
For Camel 3.x we will continue to improve the website and the documentation. This is much easier for us to do, and also for people to contribute changes as its just a regular github PR to provide updates. We love contributions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zoran had some fun with the new look and feel and he added a little gem; if you stare at the front page, then you should see a little animation of the curved bezel ;)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3) JAVA 11&lt;/b&gt;&lt;br /&gt;
Camel 3 is the first official release that supports Java 11. Java 8 will still be supported for the first number of 3.x releases, but is expected to be dropped later in 2020. However we wanted to provide Java 8 support to help migrate Camel 2.x users whom may be restricted to Java 8 for some time to come.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;4) MODULARIZED CAMEL-CORE&lt;/b&gt;&lt;br /&gt;
The camel-core has been modularized from 1 JAR to 33 JARs. The core functionality has been splitup into:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-api&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-base&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-caffeine-lrucache&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-cloud&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-core&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-core-engine&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-core-osgi&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-core-xml&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-endpointdsl&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-headersmap&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-jaxp&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-main&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-management-api&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-management-impl&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-support&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-util&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-util-json&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
For Camel end users then only a few JARs is relevant.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;camel-api&lt;/b&gt; contains the public API for Camel (eg interfaces such as CamelContext, Endpoint, Exchange, Message, and so on).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;camel-support &lt;/b&gt;contains the base classes and RouteBuilder which you would use to build Camel routes and applications. This JAR is also contains necessary base classes for building custom Camel components, and other kinds of plugins.&lt;br /&gt;
&lt;br /&gt;
The components that resided in camel-core has also be externalized into individual components:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-bean&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-log&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-stub&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-browse&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-mock&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-timer&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-controlbus&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-properties&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-validator&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-dataformat&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-ref&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-vm&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-direct&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-rest&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-xpath&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-directvm&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-saga&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-xslt&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-file&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-scheduler&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-zip-deflater&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-language&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;camel-seda&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Camel end users can then pick and choose exactly only what they need, or keep using everything.&lt;br /&gt;
&lt;br /&gt;
Therefore we have camel-core and camel-core-engine as two starting dependencies. You can use camel-core which gives you all the JARs which is similar to Camel 2.x. When you use camel-core-engine you get the minimum set of JARs that makes a functional Camel.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://camel.apache.org/blog/Camel3-Whatsnew/camel3-core-vs-engine.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;217&quot; data-original-width=&quot;652&quot; height=&quot;132&quot; src=&quot;https://camel.apache.org/blog/Camel3-Whatsnew/camel3-core-vs-engine.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;camel-core&lt;/b&gt; contains 33 JARs and &lt;b&gt;camel-core-engine&lt;/b&gt; contains 12 JARs.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;5) FASTER STARTUP AND LOWER FOOTPRINT&lt;/b&gt;&lt;br /&gt;
We have reduced the size of core Camel and the number of classes loaded. For example in Camel 2 about 5200 classes was loaded, which has been reduced to about 4300 loaded classes in Camel 3.&lt;br /&gt;
&lt;br /&gt;
We have also done many smaller optimizations in the core, to reduce the number of allocated Java objects, and speeup initialization and other means. We have used JVM profiling tools to assist and find the bottlenecks.&lt;br /&gt;
&lt;br /&gt;
Another area of improvement is to reduce Java reflections. In Camel 2 then all the configuration of Camel components, endpoints, and routes are reflection based. In Camel 3 we have source code generated Java code for configuration that allows us to use direct Java calls instead of reflections.&lt;br /&gt;
&lt;br /&gt;
Another similar area is Camel’s type converters which in Camel 2 are Java reflection based (you could build custom type converts that were not reflection based). In Camel 3 we also generate Java source code which means that type converting is direct Java calls at runtime.&lt;br /&gt;
&lt;br /&gt;
We have also moved initialization logic to earlier phases when it was possible. For example there is a new build phase which allows Camel to do special initialization during building your project (this requires Camel Quarkus).&lt;br /&gt;
&lt;br /&gt;
All this optimization improves the startup performance of Camel and reduces the memory overhead. With Camel Quarkus you can natively compile your Camel application and make it startup in 30 milli seconds and consume only 10mb of memory (RSS) with a full blown HTTP REST server and health-checks and metrics.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://camel.apache.org/blog/Camel3-Whatsnew/camel3-quarkus_huba2c5d62ef8e8448d234c82a5572ee1a_737648_800x0_resize_q95_gaussian_2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;595&quot; data-original-width=&quot;800&quot; height=&quot;297&quot; src=&quot;https://camel.apache.org/blog/Camel3-Whatsnew/camel3-quarkus_huba2c5d62ef8e8448d234c82a5572ee1a_737648_800x0_resize_q95_gaussian_2.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
There are still a few items on the agenda that we want to work on in Camel 3.x to further optimize Camel core.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;6) TYPE SAFE ENDPOINT DSL&lt;/b&gt;&lt;br /&gt;
Camel end users whom has configured endpoints using URI strings, would all have experienced the problem when you make a configuration mistake in the endpoint, which then makes Camel fail on startup.&lt;br /&gt;
&lt;br /&gt;
In Camel 3, we have a new type-safe DSL for endpoints which you can use in Java routes. You can continue to use the classic URI strings, but if you want to try the endpoint DSL, then you need to add camel-endpointdsl to your classpath. Then you should extend EndpointRouteBuilder instead of RouteBuilder to access the endpoint DSL.&lt;br /&gt;
&lt;br /&gt;
Here is a basic example without and with the endpoint DSL:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;from(&quot;timer:click?period=3000&amp;amp;fixedRate=true&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; .to(&quot;seda:foo?blockWhenFull=true&quot;);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;from(timer(&quot;click&quot;).period(3000).fixedRate(true))&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; .to(seda(&quot;foo&quot;).blockWhenFull(true));&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
You can also find a &lt;a href=&quot;https://github.com/apache/camel/tree/master/examples/camel-example-cafe-endpointdsl&quot;&gt;little example&lt;/a&gt; in the source code.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;7) REACTIVE ROUTING ENGINE&lt;/b&gt;&lt;br /&gt;
The routing engine in Camel has internally been reactive’fied and all EIPs has been retrofitted to work in a reactive manner. However this is internal only, and the Camel API for both end users and component developers are based on existing callback behavior.&lt;br /&gt;
&lt;br /&gt;
We will later introduce and work on a client-side facing reactive API after we have jumped to Java 11 as minimum version (then we can support Java 9 flowable API).&lt;br /&gt;
&lt;br /&gt;
Camel already have integration with reactive frameworks such as Vert.X, RxJava and Reactor Core in the dedicated Camel components.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;8) CAMEL MAIN&lt;/b&gt;&lt;br /&gt;
We have introduced camel-main as a standalone JAR that makes it easier to run just Camel. There are a couple of examples with the source code that demonstrates how to do that.&lt;br /&gt;
&lt;br /&gt;
We also use camel-main to have common code to configure and bootstrap Camel for standalone, Spring Boot, Camel K, and Camel Quarkus. This allows us to share the same code, and configuration options.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;9) CAMEL MICROPROFILE&lt;/b&gt;&lt;br /&gt;
Camel 3 now integrates better with Eclipse Microprofile and we have Camel components for Microprofile configuration, metrics, health checks, and fault tolerance (on the way).&lt;br /&gt;
&lt;br /&gt;
More components to come in upcoming Camel releases. These microprofile components are also used by Camel Quarkus.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;10) MISCELLANEOUS IMPROVEMENTS&lt;/b&gt;&lt;br /&gt;
Camel 3 now supports JUnit 5 for unit tests, with the test components that have -junit5 as suffix.&lt;br /&gt;
&lt;br /&gt;
The Camel Registry is now also writeable, so you can add beans to the registry at runtime, or from unit tests etc.&lt;br /&gt;
&lt;br /&gt;
You can also configure endpoints (producer) to lazy start. By default Camel works in a fail-fast mode, which means that Camel components that fails to connect to external systems during startup may cause the route to fail on startup. For Camel 3 you can now configure these endpoints to lazy start, which means the route will startup and they will first fail when a message is routed to the endpoint.&lt;br /&gt;
&lt;br /&gt;
Camel also allows to configure your routes to be supervised during startup, which allows Camel to more intelligently start routes in a more safe manner, by restarting routes that failed.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;11) MIGRATING TO CAMEL 3&lt;/b&gt;&lt;br /&gt;
We have of course cleaned up the code base, such as removing all deprecated APIs and components. We have also adjusted some APIs to make them easier to use from end users, and more Java 8 lambda friendly.&lt;br /&gt;
&lt;br /&gt;
Internally we have also adjusted the route model, to make it easier to extend into new DSLs; and there is a YAML DSL on the way which was initiated in Camel K.&lt;br /&gt;
&lt;br /&gt;
In terms of backwards compatibility then Camel 3 is mostly compatibility for regular Camel applications. However if you are using some of the more advanced features and other plugins in Camel then migration is needed. Also custom components must be migrated and recompiled. There are other adjustments such as Spring Boot users must use org.apache.camel.springboot as groupId instead of org.apache.camel etc. All details can be seen in the &lt;a href=&quot;https://camel.apache.org/manual/latest/camel-3-migration-guide.html&quot;&gt;migration guide&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Good luck with your migration if you decide to continue your Camel journey. And for new users to Camel then good luck getting onboard.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;12) BONUS: NEW COMPONENTS&lt;/b&gt;&lt;br /&gt;
There are 30 net new components in Camel 3, such as more stuff for Amazon AWS, and with GraphQL, and also worthwhile to mention is integration with Debezium, which is a change data capture project to grab change events from databases.&amp;nbsp;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/4295262075055240094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=4295262075055240094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/4295262075055240094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/4295262075055240094'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2019/12/apache-camel-3-whats-new-top-10.html' title='Apache Camel 3 - Whats New Top 10'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-6214253038678836860</id><published>2019-10-07T11:10:00.002+02:00</published><updated>2019-10-07T11:10:53.561+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="conference"/><title type='text'>Upcoming Tech Event in Copenhagen - What does the system integration toolbox anno 2019 looks like</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
On October 24th 2019, I am presenting at a full day tech event in Copenhagen.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-gsf8JudinqE/XZr-Q9FgLcI/AAAAAAAAB_8/OCD7rmJW_SMXcfpkDDyu7HGuj65h89MrgCLcBGAsYHQ/s1600/Screenshot%2B2019-10-07%2Bat%2B10.58.34.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;242&quot; data-original-width=&quot;640&quot; height=&quot;151&quot; src=&quot;https://1.bp.blogspot.com/-gsf8JudinqE/XZr-Q9FgLcI/AAAAAAAAB_8/OCD7rmJW_SMXcfpkDDyu7HGuj65h89MrgCLcBGAsYHQ/s400/Screenshot%2B2019-10-07%2Bat%2B10.58.34.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
My session is the first of the day, with a total of 90 minutes covering all the latest about &lt;a href=&quot;https://camel.apache.org/&quot;&gt;Apache Camel&lt;/a&gt; 3, Camel K, and Camel Quarkus. I will have up to date slides, and demos ready for the talk.&lt;br /&gt;
&lt;br /&gt;
The event also hosts other speakers such as &lt;a href=&quot;https://www.linkedin.com/in/jeppecramon/&quot;&gt;Jeppe Cramon&lt;/a&gt; whom will talk about EDA and microservices. And I have been told that we should look forward to Syed Shaaf&#39;s session where he has a big tech demo with many moving parts.&lt;br /&gt;
&lt;br /&gt;
In the afternoon you can choose to listen to breakout sessions or attend a full 2,5 hours hands-on workshop. The breakout sessions will among others cover use-cases with Apache Camel and Apache Kafka from the real world.&lt;br /&gt;
&lt;br /&gt;
You can find more details about the &lt;a href=&quot;https://techevent.nemtilmeld.dk/1/&quot;&gt;event, the location, and how to register here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Hope to see you there.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Cloud-native integration with Apache Camel on Kubernetes&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Cloud-native applications of the future will consist of hybrid workloads: stateful applications, batch jobs, microservices, and functions, wrapped as Linux containers and deployed via Kubernetes on any cloud.&lt;br /&gt;
&lt;br /&gt;
In this session, we will explore key challenges with function interactions and coordination, addressing these problems using Enterprise Integration Patterns (EIP) and modern approaches with the latest innovations from the Apache Camel community:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Apache Camel 3&lt;/li&gt;
&lt;li&gt;Camel K&lt;/li&gt;
&lt;li&gt;Camel Quarkus&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Apache Camel is the Swiss army knife of integration, and the most powerful integration framework. In this session you will hear about the latest features in the brand new 3rd generation.&lt;br /&gt;
&lt;br /&gt;
Camel K, is a lightweight integration platform that enables Enterprise Integration Patterns to be used natively on any Kubernetes cluster. When used in combination with Knative, a framework that adds serverless building blocks to Kubernetes, and the subatomic execution environment of Quarkus, Camel K can mix serverless features such as auto-scaling, scaling to zero, and event-based communication with the outstanding integration capabilities of Apache Camel.&lt;br /&gt;
&lt;br /&gt;
We will show how Camel K works. We&#39;ll also use examples to demonstrate how Camel K makes it easier to connect to cloud services or enterprise applications using some of the 300 components that Camel provides.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/6214253038678836860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=6214253038678836860' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/6214253038678836860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/6214253038678836860'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2019/10/upcoming-tech-event-in-copenhagen-what.html' title='Upcoming Tech Event in Copenhagen - What does the system integration toolbox anno 2019 looks like'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-gsf8JudinqE/XZr-Q9FgLcI/AAAAAAAAB_8/OCD7rmJW_SMXcfpkDDyu7HGuj65h89MrgCLcBGAsYHQ/s72-c/Screenshot%2B2019-10-07%2Bat%2B10.58.34.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-1048066886784764845</id><published>2019-10-04T09:59:00.001+02:00</published><updated>2019-10-04T09:59:24.426+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="camelk"/><category scheme="http://www.blogger.com/atom/ns#" term="conference"/><category scheme="http://www.blogger.com/atom/ns#" term="knative"/><category scheme="http://www.blogger.com/atom/ns#" term="kubernetes"/><category scheme="http://www.blogger.com/atom/ns#" term="webinar"/><title type='text'>Upcoming Webinar - Integration Patterns in a Serverless World</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Next Thursday, October 10th, I am giving a 35 minutes &lt;a href=&quot;https://www.redhat.com/en/events/webinar/develop-deploy-deliver-continuously?sc_cid=701f2000000uI48AAE&quot;&gt;webinar about Serverless Integration &lt;/a&gt;(yeah it covers &lt;a href=&quot;https://camel.apache.org/&quot;&gt;Apache Camel&lt;/a&gt;, Camel K, Knative and Quarkus).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-GI5-lB0uuUw/XZb6Lit9XWI/AAAAAAAAB_o/k4lq0lLa0IE_847E-PWevLt2xQ63fwR5ACLcBGAsYHQ/s1600/Screenshot%2B2019-10-04%2Bat%2B09.51.38.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;279&quot; data-original-width=&quot;479&quot; height=&quot;186&quot; src=&quot;https://1.bp.blogspot.com/-GI5-lB0uuUw/XZb6Lit9XWI/AAAAAAAAB_o/k4lq0lLa0IE_847E-PWevLt2xQ63fwR5ACLcBGAsYHQ/s320/Screenshot%2B2019-10-04%2Bat%2B09.51.38.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
The webinar is part of a full day event (virtual event) where there are keynotes and a parallel tracks with 12 breakout sessions.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
My talk is focused purely on the upstream work we do at Apache Camel with the next generation Camel 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The abstract for my talk&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Cloud-native applications of the future will consist of hybrid workloads: stateful applications, batch jobs, microservices, and functions, wrapped as Linux containers and deployed via Kubernetes on any cloud.&lt;br /&gt;
&lt;br /&gt;
In this session, we&#39;ll explore the key challenges with function interactions and coordination, addressing these problems using classic integration patterns and modern approaches with the latest innovation from the Apache Camel community: Camel K, a lightweight integration platform that enables enterprise integration patterns to be used natively on any Kubernetes cluster.&lt;br /&gt;
&lt;br /&gt;
When used in combination with Knative, a framework that adds serverless building blocks to Kubernetes, and the subatomic execution environment of Quarkus, Camel K can mix serverless features such as auto-scaling, scaling to zero, and event-based communication with the outstanding integration capabilities of Apache Camel.&lt;br /&gt;
&lt;br /&gt;
We will show how Camel K works. We&#39;ll also use examples to demonstrate how Camel K makes it easier to connect cloud services or enterprise applications using some of the 250+ components that Camel provides.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Registration&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The event is free to attend, and you can &lt;a href=&quot;https://www.redhat.com/en/events/webinar/develop-deploy-deliver-continuously?sc_cid=701f2000000uI48AAE&quot;&gt;signup using this link&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Date: October 10th 2019&lt;br /&gt;
Time: 5 pm CEST (event starts with keynotes)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/1048066886784764845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=1048066886784764845' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/1048066886784764845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/1048066886784764845'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2019/10/upcoming-webinar-integration-patterns.html' title='Upcoming Webinar - Integration Patterns in a Serverless World'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-GI5-lB0uuUw/XZb6Lit9XWI/AAAAAAAAB_o/k4lq0lLa0IE_847E-PWevLt2xQ63fwR5ACLcBGAsYHQ/s72-c/Screenshot%2B2019-10-04%2Bat%2B09.51.38.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-4262886850928819360</id><published>2019-10-02T10:34:00.003+02:00</published><updated>2019-10-02T10:34:50.008+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><category scheme="http://www.blogger.com/atom/ns#" term="roadmap"/><title type='text'>Apache Camel 3 is only 2 months away</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
The Camel team is busy working on the last set of work for &lt;a href=&quot;https://camel.apache.org/&quot;&gt;Apache Camel&lt;/a&gt; 3. Today the 2nd release candidate was built and published on a staging repository for &lt;a href=&quot;https://camel.465427.n5.nabble.com/VOTE-Release-Apache-Camel-3-0-0-RC2-Release-Candidate-2-td5844106.html&quot;&gt;early adapters to give it a try&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
As I am busy myself then I just wanted to write a short blog post to keep the community posted that Apache Camel 3 is on the way, and that we expect it to be released by end of this year (sometime in November or December).&lt;br /&gt;
&lt;br /&gt;
The latest deadline is to release Camel 3.0 before December 19th 2019 as it was exactly on that day 1 year ago, we switched the master branch to become the work branch for Apache Camel 3. That means the total development time for Camel 3 would be 1 year.&lt;br /&gt;
&lt;br /&gt;
Here is a illustration that highlights the timeline of Camel 3:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-sDxe7brT9Bc/XZReFJTWJSI/AAAAAAAAB_Q/Jo0nNz7Mfhwr85Xmb04sdHS0RszE-gP5QCLcBGAsYHQ/s1600/camel3-progress.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;588&quot; data-original-width=&quot;1107&quot; height=&quot;210&quot; src=&quot;https://1.bp.blogspot.com/-sDxe7brT9Bc/XZReFJTWJSI/AAAAAAAAB_Q/Jo0nNz7Mfhwr85Xmb04sdHS0RszE-gP5QCLcBGAsYHQ/s400/camel3-progress.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
That is not all Apache Camel, is now a family of 3 projects (at this moment). So working on Camel 3 is not all we do. &lt;a href=&quot;https://github.com/apache/camel-k/&quot;&gt;Camel K&lt;/a&gt; and &lt;a href=&quot;https://github.com/apache/camel-quarkus&quot;&gt;Camel Quarkus&lt;/a&gt; are very promising for cloud-native integration (microservices and serverless).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-61ZurKFeOs4/XZRfRq05faI/AAAAAAAAB_c/iHb8ARsxduAKzN3OcxUaGd-G7yguWbZmQCLcBGAsYHQ/s1600/camel3-projects.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;450&quot; data-original-width=&quot;1064&quot; height=&quot;167&quot; src=&quot;https://1.bp.blogspot.com/-61ZurKFeOs4/XZRfRq05faI/AAAAAAAAB_c/iHb8ARsxduAKzN3OcxUaGd-G7yguWbZmQCLcBGAsYHQ/s400/camel3-projects.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
These projects have their own lifecycle. Will will post more details about these projects, and what&#39;s new in Camel 3 in the following months leading up to the final release of Camel 3.&amp;nbsp; So stay tuned.&lt;br /&gt;
&lt;br /&gt;
PS: If you are migrating Camel 2.x applications to Camel 3, then read the &lt;a href=&quot;https://camel.apache.org/manual/latest/camel-3-migration-guide.html&quot;&gt;migration guide&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/4262886850928819360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=4262886850928819360' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/4262886850928819360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/4262886850928819360'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2019/10/apache-camel-3-is-only-2-months-away.html' title='Apache Camel 3 is only 2 months away'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-sDxe7brT9Bc/XZReFJTWJSI/AAAAAAAAB_Q/Jo0nNz7Mfhwr85Xmb04sdHS0RszE-gP5QCLcBGAsYHQ/s72-c/camel3-progress.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5283832592516522895.post-7312353602341555231</id><published>2019-08-21T06:20:00.001+02:00</published><updated>2019-08-21T06:20:39.182+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache camel"/><title type='text'>New website for Apache Camel</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Yesterday we published the new website for &lt;a href=&quot;https://camel.apache.org/&quot;&gt;Apache Camel&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://camel.apache.org/&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;739&quot; data-original-width=&quot;1420&quot; height=&quot;207&quot; src=&quot;https://1.bp.blogspot.com/-rx6zt4O_spo/XVzGDkRszxI/AAAAAAAAB9k/3A4B8jJqrw0o7MBNhviRkqzPzj1vNRIGACLcBGAs/s400/Screenshot%2B2019-08-21%2Bat%2B06.15.03.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
It&#39;s really fantastic to finally see a new website. And now with a modern tech for the website we can much easier update and keep it more modern for the future, and also it should help encourage users to contribute to its content to help build a better user guide.&lt;br /&gt;
&lt;br /&gt;
Huge thanks to all involved.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.davsclaus.com/feeds/7312353602341555231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5283832592516522895&amp;postID=7312353602341555231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/7312353602341555231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5283832592516522895/posts/default/7312353602341555231'/><link rel='alternate' type='text/html' href='http://www.davsclaus.com/2019/08/new-website-for-apache-camel.html' title='New website for Apache Camel'/><author><name>Claus Ibsen</name><uri>http://www.blogger.com/profile/17434564836989249540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-rx6zt4O_spo/XVzGDkRszxI/AAAAAAAAB9k/3A4B8jJqrw0o7MBNhviRkqzPzj1vNRIGACLcBGAs/s72-c/Screenshot%2B2019-08-21%2Bat%2B06.15.03.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>