From a2fbe75f47ac80828be07c250cb21c333b653677 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 16 Apr 2026 09:45:24 +0200 Subject: [PATCH 01/15] Whats new 4.19 --- .../2026/04/camel419-whatsnew/featured.jpeg | Bin 0 -> 42168 bytes .../blog/2026/04/camel419-whatsnew/index.md | 90 ++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 content/blog/2026/04/camel419-whatsnew/featured.jpeg create mode 100644 content/blog/2026/04/camel419-whatsnew/index.md diff --git a/content/blog/2026/04/camel419-whatsnew/featured.jpeg b/content/blog/2026/04/camel419-whatsnew/featured.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e7793a95b74dc5e140a33a37e571a72796a7cf2c GIT binary patch literal 42168 zcmeFZbzD^68ZSJQAO@nKNGm8XBi%XFkP-vTfPi!(9SR5oD4;{90@B@}bcjKR0#ef5 zsIJ=+2tLF$&~wua6wj;2EN#zvCv*1Q}Kl~iom{!I)gC;$tA=!NdBpulQr1$?(OvU_y(6E7>s@s_>xb6r zcOCeY5M~a7+D=*z6dxMONC~(r!XZ*}<`8FY0fd#ElZF-2+|5itLQY1@MA1=MgIAK* zkdK>(3#qJN_fSQXM_%cHm8P|u3qr+;Th&1d;qGi<#3iZCZ!LG%-dt1^J4|xG4vhTC zk<*Nq*Njs@fYnUEl!KMWnA3>W$cT%Vm6zYt%$S?kn9r1l8)!=u1_BWRM|=)0F3xbA zlXDzgJWzx`_8bQS0^zbHpSI!T;7G>#Yo3yEPv;5mQZnA@Ieu9BnO|*y7h^XGbt!py z;P`*%@xPhJqg9-jsup(6c1{*{_VnCr93TNnc_nsWT zs)88*o4KaOeT2jCe<$GobpnpZ8qi3POQ#ze4SLA3I^b~aMcw@SD zjftO$iHTp4AJ`Q26|tMXqyF*c_-lK9yd`6|H@`O=Y8o0gFq<+MtXzw-K-K<#-i}5A zN#i_v2O=fH55v2JhjSBzONxU>igVO}lM1j10nYJuOaky9Ak6p#X9$VT5}&&S!o|VE z!^OuVAi%N{jwe>o@kt3T-{6!ua|Lclc+-K5%O^aAh(WUCJ-J%<4@PbyN8hu=SFcfA zr@VEWiJ1k=!^_7nASfgy4U>_TlUGpJKp-`>?r9sFn3|beSXwzbySP4lydw{k%AqV*XgrYy_AqD8c#mC3PC&bc&gZmImEGa(04bC%{ zCE$dH4p(k+`4EvwhNqOgKg+iATl`Yc)!I;riugmU)yojy5+^s$t%i>6Ofgv z;=-{fC$EhH!C`-W>*Sl*R@hGb`lkH9G&t$lX$P^#TYo+PBU8gW>H^3?HXVQJ^i8;G zJ!)P5tEBwP^YV(n#tG=calf%QZn54X1F3bNbc}%Pzx?d!0O6dz^B0Nq(4+1u;Ey^K z*bn?4*@0OHX6Dx}uPA<2@z+I^TKE4{56&tAZ^3q*?x^Sge_GB0%!Au~+W)_f-U`|Z z+92jsw88Pvs{MBpgL^s>rEq|a{}c|?(U&TD7h#2hS0FU+kjhNH-{jCFk@%LZ+@$c?oJ8A&P^FOs9_GQff zr08@auoNA41>2o}yZ=qXfF7u+b)R+!67_}w?-ief->6xRup@1$m%nmY9zniEAR&bz5&%G3-*7NVkVDbK~ z8iBE-zl_#q@&47c6c8EaWc-tf12i=tGT7b$8n+ayyN@-*@d*8s)Bd_LK-Vo0E6|5y0*{+#q^EjcMJq7lSYV%tIG%Xy`5g z$FM(U4f~OQ4nOu9`(YNGqpp)_2F%q-Ptr30p-^Q3Yc(m|NVVuGWNzf*eV3DWwKMf; zMk+eO_YYRU2Z#q1-9%i|MdpyJN#_M}M=9{Ag`*V)Td-QYzPPGMy4fDenK0E-3~=u8|% zG(xv89UbY)aQ((6BZzOyyF}n2^R@grJ2& z@bg{+^&A3L6RW><{+DhbzY+r0wp^4XjiqmdAx+7(D?*yi10OXyCW^)4w_u*~;pw=X z^5dywpHA*yI*SF6>T~iiGVkNT%Siv@N!D8@Y|dhN!dS;sqHubJ9dQFdW=>w6{@0Vq zBu70p;@1UIGoD)`jh;`36c9AtWFrtOe(;qZm}MANcbrAvRnI>C)W04hVj{d*+Q12V zG1+lL!W1pQY-fA_#hNEnV0j%Mc;TtKeR&oJnD{^R0k&rf27pwbawzr&Ksmg&M0RJ8 zy|?$wVJB)f8N+h1u^OB@{xxaW0^BCzc)scV+bDtnKob!CVyNGo!D7i`0ZNUC!HNM^ z^#3{BCzN1&4>a(G9(}1nPLkh$L2d@FdSHHeA|suw?0NBjV^G!9dT66?)U@+2#Z|V) zIW|G0SAuqJk(a*I=2rPA`lxq^sf#qKM%^rPMf*(Ws$KC(fXOYRLrS@@-^K1%(Jah3 zmZt)&jTQ4>wp9Upv&hB1yu>ZtyqMhR^%m;qw*F4@IuB<$Tqt8CU`L!Jxs!i2?nV8< z#u2E$fK`~zL{0Pvlpr!bobxfFUe!8jNGw1hJ>N7~ZS^7}=s*TMBUH-TkoRV>C9jq7 z8XhsCIqL|dovV~N+}d^_U^r`53Gs~y=F9`{fsJ3s_fXG!0ddKauXH}RV5dFW>>R5{ z;iBEoRTY$C)JKgI`HozB?i&?icULqDd9KsNYoE;Fpu0=m_Ct`Zl}fJEwf1YDPzoLV z`~&7z=CpzD^7{8o32$Ole>=Bw(=O{RHh==$%|m- zpE?CeBb=W$w=*pw=v1n`zlF{<@3;?0!H6FSl0LV~mB0Sgk)K3ws=_!zQ2ntq=_|i}BUesQxanY?&cl1-y;Ag*P?1Y_S zA^^kupZN-_vtj_g>K%Qw_>9A9l-ma47jQ9ZNkUOg^}k^&Y?~3ao?rg%4QjyiB{S8| zL3f8cAsP_*_o7lY8`-{SN^2Z}nBg64Qo@$$1$g9|kJgmrs1-Kh*xmxR6NmX&*tJi@ z@VDf@*@AV(ian)U)F!{s;PrrnE_=$K$9z#K-l%@ms&*~^$$7{%`N+#WvOoQ0Cw0o2 zS+9>?2y)w8zqpTz4#-kDEED^pYBL5KxX?wnR={`v<8_7+q|$2oN=;=X&AX2%Kc4St zSCD;_E9fP7lf5vm+&w}M%Pd+c75w?BDX+{L^h9vj zTIJ#L;A-H#gy;d$;V!vPU$cBw5gXR_7A96;2f1|=YXebTsktaqcSBN~ZDAp~^u zWvZUYOZI4$MI{(|k8Pi}I;lA3&e%>zpAkSII50mE}BFem-vI6(#b*oA3 z&C4g53SH;TR^#rIzz|6G#}xE){&c|PB-8UF}@K{X8JbTcHBPt zz$$Wa$MpzQ`*faW;0ZD}m4=FjhTP9Cx0>b!@Qe$2c}N8FqZY6yM59Byc!@dH=QPUv zW#f-+`l*A2bJVw(on3+EN5@~BDb>(3Nb4ZeVpD{{=7>e!!+e2TI*qgjsqY=N!R%b2 zT!93w7TJ&6MB46LyPcY{!Mwp-tQ&_8=t%1TnplD9PMT!@yC&(_wu$H`CvDxqBqwbb zvPF(xcdPMs*YPJ3{G3%_5_9l5xIvYu%yRf$;41`I&!ys#^S984CHDErCGcc)jpXi-HpuK4Utg?5X}^JA zwK)7S@^%yjeoyr#sZxF-N+oP8qz;noi-@}w?M~P8#uV( zsqKMJ0d2Nl8t?5uk7n?}3^dC@y?Y>oJT@5+VsCKmYq7`KXY{L9>gRj%)w!vSBd%>` zdS}Ownm?XtJIuZF-Qf!jB*|?q@`WRcQtNI;z3U)U7m=-%=)6b6!^Iu^`a)qX#}P<0*XmPw z;$y!`-R<*)8;utIN|f|~9Zu&sG0q|P@Hu$`e!@WV@~XrB>r!%#of~vbp`|+Wv_^+U z34V@N#t@gFi9`QH4jEYmmh%~m9D2SK55nE|Lf6P6l*STg$%{#5tQ{ZS^%l{;6S$+Y zxu;=0J1$W!@uVwMN?QiW9c8N;h=}E2y8m(biH?IJbqizA3}t({H;2bLpM=_+?d{y{ z^Zf(w_d!gWtv7-t{_Z(#i z+Vxz79Z!5G7y8aMy4vpAUT1)*Zg0qJ+)WJx9n1yK#lo)Q>~~Ui%EGRaV(-JdVcwB$ zX>Qqz7RAlqdF*)Fn2SlqEcq!-$+QT+@!0YVDcr%^q2#Bu0j_Pa*UUJ>!BoL~=sS27 zly~D4m@icUccWBsXSyThVIVf8>wjL5{dQqaT^VeM2%t(vVL(@- z>#>uwbdH#a;{77Pjh|xXDCroBzNZ68<7)Vnv!xTK`9;()lnsqbM80piqVJE*A=$4Qnwn&bEq8UfO!IwUL7Y zw~)I|3l8YshWRDA$j9geE(dsDJI}%VOLx}WJi+@GwdwDLa~ox^6Fka+yjlcIDK@0*IZ&ry&~C7I~8|jFw0e25!CJcA#$_OwQQyEZAVl8jG?>=N75xc=9SaSLvPB0?OalBzn{C4 z@Q&dJufLa#PU!d0p3+tG3l_If6BJNC(?LbjI<5|TW!F8EzAxIbz3w!($l&*x=#Q=X zan$(tpquV!pyoK*_^q=3Kt8aMEH)+q0ls=VZuc*k>Ud%{s zRa8-I-Ji3Epmc|2_w#Mc?lL;KzdF=a^SCJdJmdD@J;1s+>>@KXOI6s0c(*^#BOxI= z32R6Rz`h1y`vVpUO3dmcH z6u$Eay<8Ox-Vvxk<=Rl#^0h-DYonmJ$L+;ck2~bq^b7;zb@#nBzD)K?>(@l<;AOh^ ze^TO^*qRG59ekW6k}+>yUcMhPTu)r(l2sIO9&b)!7oE65!8a-`Hh-SbK@;BB3z&|Z z@h>zKLM8pw0RlssAO*zSk1efbFyQu4D?p9Z7N?izs7MVtw>UIIrVb2U>4Pt zZWy_lQ8%Cy0KZV20E@8zQRlH5AUx{&2M_!$7LR(Ted7P0$i%Oi|C0;;_52jd2Jqcq zn8@GRj=;%1(5)gB`fbuWy%0f?;NIif3Y~2ib$RfpBbESccoM8&#LorM{HW z{vhJ&4z#V{3s%#f`VPO38dq90(&azO4enjs5;Y&Ih`z&}RGoDu=j@8m`mRlUJ8WdU zEzNgn-J#0p{@bc|S)ExKjqelUXAFc8e2T%GJ4~H`>4o~KDfCMVV}hecE9RR#tJQNU z*cd96x(^w8GP8LA);kVRk9}5r(~JIm3m?g2Gvzeu^0t(d`pc{@tBhFr)Ns-j=(?70 z^>hrx-4IbC{U&f29hu%{oKP?vJX+UigT$||>ix*R=lMTQ1awrwH)x zfdo);5C89b z9dnPHS)kvu>@4z|@pl0tj{&w{5EftO<)dl|C@hJ@TSca6#0n8IIMdCw;8r zVc?tUQRLr;DubrT3Nc=CD{4K8eBtgt&izQP^_;)u^>(v4or;SttGuHWWHVmar!P76&l; zANyaR6o>^ts{jP$1R5Yd{(vgD!J)_Yqg=3Y=RK`lgg98Cv!zcuNQPyYKnxv`&u@{r zLVk;k;MsW>JeX!qIsIgWgxu+ zUK)Q(ewSq>kyYgyWNHMuG8AvZQMJVz^a*`Gcu$+T&^R4!`0{g^0d!Afzuqq|je&tY z{Eo!?;M|GU2qu3!_9ty|UHBYrn}xP4cUfl@zw9EPI+D$j&}Hyny4#nUcdLz-YW5Hz zUuiULAUU=Pztq@+DP{istE2g`f|FDO+v$_9=$Lx5&vH>uTJ%&l_*1suFcl zY4UOEUidg`2iGbh=!>_#PVub{qJ6zB^hI`yf%gWylyKOOFU&+_RC-y%EcXLq9akm@GCeN)ghh|FJRI!n19_qqJeE>kiEd9+mO^X`jLr7fR~ z)mK#jJ_AR$8CG1}a!rfo&m3=idPchBPTGZ^2=;LuI>Z4)2Hnj?tK1>e)KvAN>f+*2GK68Es&?`f^7*gdGwD=T8LHFd4jasG24ff4ae%L^1c zVO|>GhlFYkow*pbf`80_7WxXIM0zR}C&djB(b{4Ic2AQ05#HDyR2MZ@W}T61E+ zud@lD5&*dh+pWY~DFe_sjgbt-B;PTC@MOaA-kS%0IH}Vj_ z;bhKEy0!h2ob~O_3W!RU*dlHM7Jv;)%C=Alhm9P?i z``lkm^#c}F|Lq9m=j8CV-3Uee$*ebc+3W&wcu!U?AK{L$CnqL%%ZWP&7$rGke$rLp zW+_A-B8p?k9ci5+Gi24}56Hkf!@EbIDOGGdSl2ttk zdtiwaZ@d|#zRcIDhQ+A;ez`73>ay_Puur`(OJQyKzCmatyBgJ2HQh*GO$Cr87+#k;WEV z)Hg{7i3bT8ZWf1kl>;tS4n;Is$!=gXyeBjD<#nC}@N9$rdN+zP3;9&q6z`|bdUnU_ zM266fJRWs&w9)9ux7d0d_$ae#iVT4TLiqi9PVU`U)(fN1Ly_q{MBAsHc$Z|lQAT92 zZ3rJg0Ozp;BC4wuwRS2P54xAtR770YVi^~NNc625D*TlcoE)HgWvd4Sx7+0M7`fZe z>ECq^Bi!B0nV2Il@PtW}*bC$AAz6#|ic<13gBLkpJegI$Puxt?SnYjv8kUO&noy65$ENgslfs^-Kp4s}hFVK`D5b@5ALEglUtKtg_?$I`ekb!s%&u4`7hc7bV@@S`pR^ z>6}NPas2};eD}VtmNUFt`@SJ2#AiOXQcH1h=ogVoDk1v>?$&?tLA+3UtrEAr#y!Hs zggGR4q*#%~Jo;Mq{&4dZ`*QQ5;>!%&u=@IHVVj#6f7D(dOV5_&wT{X#8N!`-y0-GC z+O=u6KUX8W&nVG%)4Ps8WcY*{64BTo3-4$Z9ZeaY&rkZ6@S*Ul6_*NoI0tCjS77nJ z2A^v&D(AW8f?%PdDxG=%&bCq321N>|K)ePVW@Q8b7PA*k^hQ`75~s{j zihNWI6Kvo2qw-V5qCjc?UoVtsE&qJRl-lQ${s{93IN+t_J}P`jr49lwN-mtt1f90$MZ`5 zT6e&DLG|n%#&z~wk!dEHU|BT zq#x;nJ(T#>1x;Qn)_Wvtg}yv;VX_n-LVP1AjD0z&jX`QP>Bd|f@b8UhFT8DdDCLs> z)b_CSGNddd7yU z@WHPcEsXgg5>12enh!P~(M8{-3Cs=_bn!5m;?O;m%sba9vm9vgL)0Io7oB$|5_|;8 zLo}fZ#~LP4HxM0WsUe8f(a=4ccZBeMBd`E|$HiL7P2+uI{-9AVG-{Fudaan`-T2PqhGa5)$YV?OD zif)@*j|#7g)Z$cge&Gcw!Mw5N01~lw$HUa$aD;SMQ%B3|Mxf`jFjPAqUHCMHCHXQR z31#IWJ;|bSuC~+nH!9m+`fY{%3-A2^8-a^W9OE4g)cqYpI*B*|#0ZNvL;>|izzH^g zirWK7*@nq_xPm&Es)R*xLPJ%22P=@`>V_UD( z%N5Q0QsyFwRVm=3roIenkNSFha;!T3p7i!2d-nVi1b2od6h9~=N=v^WmrH<=Rt93h zotUm17t;6SAkEF*Rl9NbLQ{5eT_Wm@;H{0|sw2?NqL-cGC8)=2R4qYM9ByLu2UZcH zlIOHAd0MSoX46pbypKvftoCe~T+p2>7(!mxOVfuE+cyZ!Uxa=sfVG!|WogwOfz0L)@Yf{RJUMLI2 zR1M2JqkzW&9#d#RaNcjd!uH`Tm8_lBruLLe;KQ=|eHk%%L5v3)#!93DmMydTX@QAk zPtks79X-6hRhaZ~`?Zwq7dg(kX}m!-g_ay1XF$a83CIwT{lOL1j-u9uyd?|VjtE)e z@6o>5-yY@X@U9Ap;axidIio@#A&GNyhYwm5OD33CR|u>mCWou8Ip>$`)2b{Y4EWO4 z&LqxXs1t3O-Yj@zhIZb#VbHz=38?L6TfNdr5l(o&uAVr{)PpzZgH|ZbKnaRoWG|;mrLzMjjoWvq2R%3T=@KQ3@UlyK|g^v-`>-hc_3Y~ z0C}`x%nC#%nR0+X0#uXK{|8v*k2nZ$k59bbTV$Z)!cU;I;Wyq?8g*O=3j75)`A;78 zKkr{3O0|8%w4YAd>R0cO1iM*%E_&SN<`L*MN?|tjvG_D*
#kJ;=K+j4zdD7faH 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 4.5, 4.5 -> 4.6, and so forth. + +The Camel Upgrade Recipes tool can also be used to automate upgrading. +See more at: https://github.com/apache/camel-upgrade-recipes + +## Release Notes + +You can find additional information about this release in the list of resolved JIRA tickets: + +- [Release notes 4.19](/releases/release-4.19.0/) + +## Roadmap + +The next 4.20 release is planned in June. + From f8fcc54ec71a3ef38044afd637ce2416b4743389 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 16 Apr 2026 10:25:29 +0200 Subject: [PATCH 02/15] Whats new 4.19 --- .../blog/2026/04/camel419-whatsnew/index.md | 105 ++++++++++++++++-- 1 file changed, 94 insertions(+), 11 deletions(-) diff --git a/content/blog/2026/04/camel419-whatsnew/index.md b/content/blog/2026/04/camel419-whatsnew/index.md index 6fb8eb25494..835e43833e4 100644 --- a/content/blog/2026/04/camel419-whatsnew/index.md +++ b/content/blog/2026/04/camel419-whatsnew/index.md @@ -13,27 +13,107 @@ This release introduces a set of new features and noticeable improvements that w ## Camel Core -## Camel Simple +## Simple Language + +Added more functions to the simple language to work with list/map and more functions for JSon: + +- listAdd +- listRemove +- mapAdd +- mapRemove +- sort +- toPrettyJson +- toPrettyJsonBody +- toJson +- toJsonBody +- simpleJsonpath (to extract data from JSon using Camel simple OGNL syntax) + +## XML and YAML DSL + +You can now configure SSL/TLS directly in the XML and YAML DSL. + +Here is a basic example in XML and YAML: + +```xml + + + + + + + + +``` + +```yaml +- sslContextParameters: + id: mySSL + keyStore: server.p12 + keystorePassword: changeit + trustStore: truststore.p12 + trustStorePassword: changeit +- from: + uri: "direct:ssl" + steps: + - to: "mock:ssl" +``` + +In YAML DSL then we have added support for configuring transformer and validator, something like: + +```yaml +- transformers: + loadTransformer: + defaults: true + endpointTransformer: + ref: myXmlEndpoint + fromType: xml:XmlXOrder + toType: "java:org.example.XOrder" + customTransformer: + className: org.example.MyTransformer + fromType: other:OtherXOrder + toType: "java:org.example.XOrder" + +- validators: + endpointValidator: + type: xml:XmlXOrderResponse + uri: "myxml:endpoint" + customValidator: + type: other:OtherXOrder + className: org.example.OtherXOrderValidator +``` -The simple language has been improved tremendously. -### More Functions +## Camel JBang -We have added 50 more functions to simple language so it now comes with a total of 114. +The output from the Camel JBang commands is now better fit within the current terminal width. -There are now a lot more functions to work with the data such as String related functions, -and also math functions so you can sum totals, find the maximum or minimum value and more. +Added `--json` option to many of the Camel JBang status commands to dump output in JSon instead of tables. -For example, if you work with JSon data, then there is a new `safeQuote` function, -which will based on the data type quote the value if necessary. +Added `camel transform dataweave` command to convert MuleSoft dataweave scripts into DataSonnet files which +can run in Camel using the `camel-datasonnet` component. -We also made it possible for Camel components and custom components to provide simple functions. -For example `camel-attachments` and `camel-base64` has a set of functions out of the box. +The `camel-tooling-maven` (Maven downloader) is now using the Apache Maven Mima library, which JBang also recently started using as well. -## Camel JBang +Added more smaller examples in the documentation and `--help` for the JBang commands. + +Camel JBang can now easier run and export with JPA by automatic using Hibernates as the JPA provider (if none has been selected). + +Removed exporting with Gradle as the build tool. Only Maven works reliable and is generally supported and recommended to be used. + +Added `camel wrapper` command that installs Camel Launcher with wrapper scripts (`camelw`) which allows to run Camel JBang (without JBang) +using the Camel Launcher instead with the binary installed locally, just like Maven Wrapper. This ensures consistency and locked to use +the installed version. + + +## Camel Groovy + +The `camel-groovy` JAR now included `camel-groovy-json` and `camel-groovy-xml` all combined in a single dependency. ## Camel Kafka +Upgraded to Kafka 4.2 client. + ## Camel AI ### Camel OpenAI @@ -42,6 +122,9 @@ For example `camel-attachments` and `camel-base64` has a set of functions out of ## Camel Spring Boot +This is our first release that supports Spring Boot v4. +Spring Boot v3 is no longer supported. + ## JDK25 compatibility ## Miscellaneous From 56f4113d32d6bc184181c5bad9f66a9975452cbb Mon Sep 17 00:00:00 2001 From: Croway Date: Thu, 16 Apr 2026 14:51:04 +0200 Subject: [PATCH 03/15] MCP Client support + OAuth Support --- .../blog/2026/04/camel419-whatsnew/index.md | 60 ++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/content/blog/2026/04/camel419-whatsnew/index.md b/content/blog/2026/04/camel419-whatsnew/index.md index 835e43833e4..f9a29be2578 100644 --- a/content/blog/2026/04/camel419-whatsnew/index.md +++ b/content/blog/2026/04/camel419-whatsnew/index.md @@ -2,7 +2,7 @@ title: "Apache Camel 4.19 What's New" date: 2026-04-20 draft: false -authors: [ davsclaus ] +authors: [ davsclaus, croway ] categories: [ "Releases" ] preview: "Details of what we have done in the Camel 4.19 release." --- @@ -118,7 +118,63 @@ Upgraded to Kafka 4.2 client. ### Camel OpenAI -### MCP Server +### MCP Client Support + +`camel-openai`, `camel-langchain4j-agent`, and `camel-spring-ai-chat` can now act as MCP clients, connecting to external MCP servers to discover and invoke tools during a conversation. + +When MCP servers are configured, the component runs an agentic loop automatically. MCP Tools are exposed to the model, the component executes them via MCP, feeds results back, and repeats until the model produces a final text answer. + +MCP servers are configured inline on the endpoint URI. For example, connecting to a filesystem MCP server: + +```java +from("direct:chat") + .to("openai:chat-completion?model=gpt-4" + + "&mcpServer.fs.transportType=stdio" + + "&mcpServer.fs.command=npx" + + "&mcpServer.fs.args=-y,@modelcontextprotocol/server-filesystem,/tmp") + .log("${body}"); +``` + +Multiple servers can be configured on the same endpoint, tools from all servers are merged and made available to the model. Stdio, SSE, and Streamable HTTP transports are supported: + +```java +from("direct:chat") + .to("openai:chat-completion?model=gpt-4" + + "&mcpServer.fs.transportType=stdio" + + "&mcpServer.fs.command=npx" + + "&mcpServer.fs.args=-y,@modelcontextprotocol/server-filesystem,/tmp" + + "&mcpServer.weather.transportType=streamableHttp" + + "&mcpServer.weather.url=http://localhost:9090/mcp"); +``` + +#### OAuth for AI Components + +A new OAuth SPI makes it easy to authenticate AI components against identity providers (e.g., Azure AD, Keycloak) using the OAuth 2.0 Client Credentials grant. Define a named profile in your Camel properties and reference it on the endpoint. The token is acquired and refreshed automatically, with caching built in. This requires `camel-oauth` on the classpath. + +```properties +camel.oauth.azure.client-id=my-client +camel.oauth.azure.client-secret=my-secret +camel.oauth.azure.token-endpoint=https://login.microsoftonline.com/tenant/oauth2/v2.0/token +camel.oauth.azure.scope=https://cognitiveservices.azure.com/.default +``` + +```java +from("direct:chat") + .to("openai:chat-completion?model=gpt-4&oauthProfile=azure"); +``` + +MCP servers can also use their own OAuth profile independently, so a single route can authenticate against both the LLM provider and a secured MCP server: + +```java +from("direct:chat") + .to("openai:chat-completion?model=gpt-4" + + "&oauthProfile=azure" + + "&mcpServer.tools.transportType=streamableHttp" + + "&mcpServer.tools.url=https://mcp.internal/mcp" + + "&mcpServer.tools.oauthProfile=keycloak"); +``` + +The OAuth SPI is also available on `camel-langchain4j-agent`, `camel-docling` and `camel-ibm-watsonx-ai`. It has been successfully tested with [Wanaku](https://www.wanaku.ai/), an open-source MCP router that federates multiple MCP servers behind a single secured endpoint. ## Camel Spring Boot From e16ad943194549d4354efbcdcd61568b80a9d4e7 Mon Sep 17 00:00:00 2001 From: Pasquale Congiusti Date: Thu, 16 Apr 2026 15:32:15 +0200 Subject: [PATCH 04/15] chore: deprecations and micrometer shutdown feature --- .../blog/2026/04/camel419-whatsnew/index.md | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/content/blog/2026/04/camel419-whatsnew/index.md b/content/blog/2026/04/camel419-whatsnew/index.md index f9a29be2578..c0924098cd6 100644 --- a/content/blog/2026/04/camel419-whatsnew/index.md +++ b/content/blog/2026/04/camel419-whatsnew/index.md @@ -2,7 +2,7 @@ title: "Apache Camel 4.19 What's New" date: 2026-04-20 draft: false -authors: [ davsclaus, croway ] +authors: [ davsclaus, croway, squakez ] categories: [ "Releases" ] preview: "Details of what we have done in the Camel 4.19 release." --- @@ -86,7 +86,7 @@ In YAML DSL then we have added support for configuring transformer and validator ## Camel JBang -The output from the Camel JBang commands is now better fit within the current terminal width. +The output from the Camel JBang commands is now better fit within the current terminal width. Added `--json` option to many of the Camel JBang status commands to dump output in JSon instead of tables. @@ -103,7 +103,7 @@ Removed exporting with Gradle as the build tool. Only Maven works reliable and i Added `camel wrapper` command that installs Camel Launcher with wrapper scripts (`camelw`) which allows to run Camel JBang (without JBang) using the Camel Launcher instead with the binary installed locally, just like Maven Wrapper. This ensures consistency and locked to use -the installed version. +the installed version. ## Camel Groovy @@ -176,6 +176,22 @@ from("direct:chat") The OAuth SPI is also available on `camel-langchain4j-agent`, `camel-docling` and `camel-ibm-watsonx-ai`. It has been successfully tested with [Wanaku](https://www.wanaku.ai/), an open-source MCP router that federates multiple MCP servers behind a single secured endpoint. +## Meter logging on shutdown + +In this release we're introducing the possibility to trace Micrometer metrics when the application is shutting down. When you have a controlled shutdown (for example, a cronjob executing) or a shutdown produced by any fatal error you are in a situation where your last metrics you may have not been able to scrape are lost. From now on you can enable the feature `camel.metrics.logMetricsOnShutdown=true` (and `camel.metrics.logMetricsOnShutdownFilters=camel.exchanges.*`, default `*`) and be able to store those values for any post mortem evaluation (for example when your Kubernetes Pod is stopping gracefully or crashed): + +```bash +2026-03-02 10:50:13.021 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : Micrometer component is stopping, here a list of metrics collected so far. +... +2026-03-02 10:50:13.050 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : {"name":"camel.exchanges.succeeded","type":"counter","value":0.0,"tags":{"routeId":"","kind":"CamelRoute","camelContext":"camel-1","eventType":"context"}} +2026-03-02 10:50:13.050 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : {"name":"camel.exchanges.failed","type":"counter","value":0.0,"tags":{"routeId":"","kind":"CamelRoute","camelContext":"camel-1","eventType":"context"}} +2026-03-02 10:50:13.050 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : {"name":"camel.exchanges.total","type":"counter","value":0.0,"tags":{"routeId":"","kind":"CamelRoute","camelContext":"camel-1","eventType":"context"}} +``` + +## MDC Service wildcard filter + +You can use the wildcard `*` into your headers (`camel.mdc.customHeaders`) or properties (`camel.mdc.customProperties`) filter configuration, for example `CAMEL_HTTP_*` or `my_*_property` to select the values to include in your MDC logging trace. From now on you can spare some time and avoid to include all configuration one by one. + ## Camel Spring Boot This is our first release that supports Spring Boot v4. @@ -205,6 +221,15 @@ We have some new components to this release. - `camel-pgvector` - Perform operations on the PostgreSQL pgvector Vector Database. - `camel-spring-ai-image` - Spring AI Image Generation +## Deprecations + +Starting from this version we're deprecating the following components: + +- `camel-tracing` based components (`camel-opentelemetry`, `camel-observation`): replaced by `camel-telemetry` components (`camel-opentelemetry2`, `camel-micrometer-observability`). +- Old MDC technology (`camel.main.useMdcLogging = true`): replaced by `camel-mdc` service. + +You're invited to move to the new components already in this version. + ## Upgrading Make sure to read the [upgrade guide](/manual/camel-4x-upgrade-guide-4_19.html) if you are upgrading from a previous From 4e5614898ca1a382d9d2a401a18600a030c90893 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 16 Apr 2026 16:10:56 +0200 Subject: [PATCH 05/15] Whats new 4.19 --- .../2026/04/camel419-whatsnew/featured.jpeg | Bin 42168 -> 37788 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/content/blog/2026/04/camel419-whatsnew/featured.jpeg b/content/blog/2026/04/camel419-whatsnew/featured.jpeg index e7793a95b74dc5e140a33a37e571a72796a7cf2c..26246464b450723c3ba6bcf701aba92f8102be01 100644 GIT binary patch literal 37788 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 literal 42168 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
#kJ;=K+j4zdD7faH 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 Date: Thu, 16 Apr 2026 16:17:26 +0200 Subject: [PATCH 06/15] Whats new 4.19 --- .../blog/2026/04/camel419-whatsnew/index.md | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/content/blog/2026/04/camel419-whatsnew/index.md b/content/blog/2026/04/camel419-whatsnew/index.md index c0924098cd6..328bb69c6c0 100644 --- a/content/blog/2026/04/camel419-whatsnew/index.md +++ b/content/blog/2026/04/camel419-whatsnew/index.md @@ -15,18 +15,26 @@ This release introduces a set of new features and noticeable improvements that w ## Simple Language -Added more functions to the simple language to work with list/map and more functions for JSon: - -- listAdd -- listRemove -- mapAdd -- mapRemove -- sort -- toPrettyJson -- toPrettyJsonBody -- toJson -- toJsonBody -- simpleJsonpath (to extract data from JSon using Camel simple OGNL syntax) +Added more functions to the simple language to work with list/map: + +- `listAdd(fun)` - Adds the result of the function to the message body as a list object. +- `listAdd(source,fun)` - Adds the result of the function to the source expression as a list object. +- `listRemove(fun)` - Removes the result of the function (use int to remove by position index) from the message body as a list object. +- `listRemove(source,fun)` - Removes the result of the function (use int to remove by position index) from the source expression as a list object. +- `mapAdd(key,fun)` - Adds the result of the function to the message body as a map object. +- `mapAdd(source,key,fun)` - Adds the result of the function to the source expression as a map object. +- `mapRemove(key)` - Removes the key from the message body as a map object. +- `mapRemove(source,key)` - Removes the key from the source expression as a map object. +- `sort(exp,reverse)` - Sorts the message body or expression in natural order + +And also new functions for JSon: + +- `toPrettyJson(exp)` - Converts the expression to a JSon `String` representation. String values are returned as-is, null values return null, all other types are serialized to JSon in pretty mode. +- `toPrettyJsonBody` - Converts the message body to a JSon `String` representation. String values are returned as-is, null values return null, all other types are serialized to JSon in pretty mode. +- `toJson(exp)` - Converts the expression to a JSon `String` representation. String values are returned as-is, null values return null, all other types are serialized to JSon. +- `toJsonBody` - Converts the message body to a JSon `String` representation. String values are returned as-is, null values return null, all other types are serialized to JSon. +- `simpleJsonpath(exp)` - When working with JSon data, then this allows using built-in Simple JsonPath, for example, to extract data from the message body (in JSon format). +- `simpleJsonpath(input,exp)` - Same as `simpleJsonpath(exp)` but to use the _input_ expression as the source of the JSon document. ## XML and YAML DSL @@ -199,6 +207,8 @@ Spring Boot v3 is no longer supported. ## JDK25 compatibility +We expect the next Camel 4.20 release to support Java 25. + ## Miscellaneous Upgraded many third-party dependencies to the latest releases at the time of release. From b89c37cd11b50542b8502c2e6b97d275db86cbf9 Mon Sep 17 00:00:00 2001 From: Tom Cunningham Date: Thu, 16 Apr 2026 12:13:16 -0400 Subject: [PATCH 07/15] Add a blurb about the new Jackson 3 components now available (#1576) --- content/blog/2026/04/camel419-whatsnew/index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/blog/2026/04/camel419-whatsnew/index.md b/content/blog/2026/04/camel419-whatsnew/index.md index 328bb69c6c0..b9c92c73c51 100644 --- a/content/blog/2026/04/camel419-whatsnew/index.md +++ b/content/blog/2026/04/camel419-whatsnew/index.md @@ -205,6 +205,10 @@ You can use the wildcard `*` into your headers (`camel.mdc.customHeaders`) or pr This is our first release that supports Spring Boot v4. Spring Boot v3 is no longer supported. +### Camel Jackson 3 Components + +Four new components have been added which provide Jackson 3 support - they are named similarly to the previously existing camel-jackson components. Jackson 3 operates under a different package name (tools.jackson.* vs. com.fasterxml.jackson) and there are a number of API changes between Jackson 2 and Jackson 3. The [upgrade guide](/manual/camel-4x-upgrade-guide-4_19.html) has a lot of details on how to migrate your Camel application to Jackson 3. + ## JDK25 compatibility We expect the next Camel 4.20 release to support Java 25. From d6c0fdafec1bec626a647007051c7d7ac7d585b0 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 16 Apr 2026 18:15:00 +0200 Subject: [PATCH 08/15] Whats new 4.19 --- content/blog/2026/04/camel419-whatsnew/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/blog/2026/04/camel419-whatsnew/index.md b/content/blog/2026/04/camel419-whatsnew/index.md index b9c92c73c51..f69e781594a 100644 --- a/content/blog/2026/04/camel419-whatsnew/index.md +++ b/content/blog/2026/04/camel419-whatsnew/index.md @@ -2,7 +2,7 @@ title: "Apache Camel 4.19 What's New" date: 2026-04-20 draft: false -authors: [ davsclaus, croway, squakez ] +authors: [ davsclaus, croway, squakez, cunningt ] categories: [ "Releases" ] preview: "Details of what we have done in the Camel 4.19 release." --- @@ -221,7 +221,7 @@ Upgraded many third-party dependencies to the latest releases at the time of rel We have some new components to this release. -- `camel-azure-functions` - Invoke and manage Azure Functions. +- `camel-azure-functions` - Invoke and manage Azure Functions. - `camel-camunda` - Interact with Camunda 8 Orchestration Clusters using the Camunda Java Client. - `camel-event` - Subscribe to Camel internal events such as route started/stopped and exchange. - `camel-google-firestore` - Store and retrieve data from Google Cloud Firestore NoSQL database. From d0308fc8414c95d6bec7eef7a12018c76c1024e2 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Fri, 17 Apr 2026 09:12:27 +0200 Subject: [PATCH 09/15] Whats new 4.19 --- .../blog/2026/04/camel419-whatsnew/index.md | 81 ++++++++++++++----- 1 file changed, 60 insertions(+), 21 deletions(-) diff --git a/content/blog/2026/04/camel419-whatsnew/index.md b/content/blog/2026/04/camel419-whatsnew/index.md index f69e781594a..17c34d0d2e8 100644 --- a/content/blog/2026/04/camel419-whatsnew/index.md +++ b/content/blog/2026/04/camel419-whatsnew/index.md @@ -11,9 +11,18 @@ Apache Camel 4.19 has just been [released](/blog/2026/04/RELEASE-4.19.0/). This release introduces a set of new features and noticeable improvements that we will cover in this blog post. +## Camel Spring Boot + +This is our first release that supports Spring Boot v4. +Spring Boot v3 is no longer supported. + +### Camel Jackson 3 Components + +Four new components have been added which provide Jackson 3 support - they are named similarly to the previously existing camel-jackson components. Jackson 3 operates under a different package name (tools.jackson.* vs. com.fasterxml.jackson) and there are a number of API changes between Jackson 2 and Jackson 3. The [upgrade guide](/manual/camel-4x-upgrade-guide-4_19.html) has a lot of details on how to migrate your Camel application to Jackson 3. + ## Camel Core -## Simple Language +### Simple Language Added more functions to the simple language to work with list/map: @@ -36,7 +45,7 @@ And also new functions for JSon: - `simpleJsonpath(exp)` - When working with JSon data, then this allows using built-in Simple JsonPath, for example, to extract data from the message body (in JSon format). - `simpleJsonpath(input,exp)` - Same as `simpleJsonpath(exp)` but to use the _input_ expression as the source of the JSon document. -## XML and YAML DSL +### XML and YAML DSL You can now configure SSL/TLS directly in the XML and YAML DSL. @@ -113,6 +122,24 @@ Added `camel wrapper` command that installs Camel Launcher with wrapper scripts using the Camel Launcher instead with the binary installed locally, just like Maven Wrapper. This ensures consistency and locked to use the installed version. +## Observability + +### Meter logging on shutdown + +In this release we're introducing the possibility to trace Micrometer metrics when the application is shutting down. When you have a controlled shutdown (for example, a cronjob executing) or a shutdown produced by any fatal error you are in a situation where your last metrics you may have not been able to scrape are lost. From now on you can enable the feature `camel.metrics.logMetricsOnShutdown=true` (and `camel.metrics.logMetricsOnShutdownFilters=camel.exchanges.*`, default `*`) and be able to store those values for any post mortem evaluation (for example when your Kubernetes Pod is stopping gracefully or crashed): + +```bash +2026-03-02 10:50:13.021 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : Micrometer component is stopping, here a list of metrics collected so far. +... +2026-03-02 10:50:13.050 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : {"name":"camel.exchanges.succeeded","type":"counter","value":0.0,"tags":{"routeId":"","kind":"CamelRoute","camelContext":"camel-1","eventType":"context"}} +2026-03-02 10:50:13.050 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : {"name":"camel.exchanges.failed","type":"counter","value":0.0,"tags":{"routeId":"","kind":"CamelRoute","camelContext":"camel-1","eventType":"context"}} +2026-03-02 10:50:13.050 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : {"name":"camel.exchanges.total","type":"counter","value":0.0,"tags":{"routeId":"","kind":"CamelRoute","camelContext":"camel-1","eventType":"context"}} +``` + +### MDC Service wildcard filter + +You can use the wildcard `*` into your headers (`camel.mdc.customHeaders`) or properties (`camel.mdc.customProperties`) filter configuration, for example `CAMEL_HTTP_*` or `my_*_property` to select the values to include in your MDC logging trace. From now on you can spare some time and avoid to include all configuration one by one. + ## Camel Groovy @@ -124,8 +151,6 @@ Upgraded to Kafka 4.2 client. ## Camel AI -### Camel OpenAI - ### MCP Client Support `camel-openai`, `camel-langchain4j-agent`, and `camel-spring-ai-chat` can now act as MCP clients, connecting to external MCP servers to discover and invoke tools during a conversation. @@ -184,30 +209,44 @@ from("direct:chat") The OAuth SPI is also available on `camel-langchain4j-agent`, `camel-docling` and `camel-ibm-watsonx-ai`. It has been successfully tested with [Wanaku](https://www.wanaku.ai/), an open-source MCP router that federates multiple MCP servers behind a single secured endpoint. -## Meter logging on shutdown +## Gmail DataType Transformers -In this release we're introducing the possibility to trace Micrometer metrics when the application is shutting down. When you have a controlled shutdown (for example, a cronjob executing) or a shutdown produced by any fatal error you are in a situation where your last metrics you may have not been able to scrape are lost. From now on you can enable the feature `camel.metrics.logMetricsOnShutdown=true` (and `camel.metrics.logMetricsOnShutdownFilters=camel.exchanges.*`, default `*`) and be able to store those values for any post mortem evaluation (for example when your Kubernetes Pod is stopping gracefully or crashed): - -```bash -2026-03-02 10:50:13.021 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : Micrometer component is stopping, here a list of metrics collected so far. -... -2026-03-02 10:50:13.050 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : {"name":"camel.exchanges.succeeded","type":"counter","value":0.0,"tags":{"routeId":"","kind":"CamelRoute","camelContext":"camel-1","eventType":"context"}} -2026-03-02 10:50:13.050 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : {"name":"camel.exchanges.failed","type":"counter","value":0.0,"tags":{"routeId":"","kind":"CamelRoute","camelContext":"camel-1","eventType":"context"}} -2026-03-02 10:50:13.050 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : {"name":"camel.exchanges.total","type":"counter","value":0.0,"tags":{"routeId":"","kind":"CamelRoute","camelContext":"camel-1","eventType":"context"}} -``` +Two new DataType Transformers have been added for the Gmail component, removing the need to manually construct Gmail API request objects. -## MDC Service wildcard filter +The `google-mail:update-message-labels` transformer reads `addLabels` and `removeLabels` from exchange variables and builds the `ModifyMessageRequest` automatically: -You can use the wildcard `*` into your headers (`camel.mdc.customHeaders`) or properties (`camel.mdc.customProperties`) filter configuration, for example `CAMEL_HTTP_*` or `my_*_property` to select the values to include in your MDC logging trace. From now on you can spare some time and avoid to include all configuration one by one. +```yaml + - setVariable: + name: addLabels + simple: ${variable.triageCategory} + - setVariable: + name: removeLabels + constant: INBOX + - transformDataType: + toType: google-mail:update-message-labels + - to: + uri: google-mail:messages/modify + parameters: + inBody: modifyMessageRequest + applicationName: camel-email-triage + userId: me +``` -## Camel Spring Boot +The `google-mail:draft` transformer constructs a proper `Draft` object with email headers (`In-Reply-To`, `References`, `To`, `Subject`) from the exchange: -This is our first release that supports Spring Boot v4. -Spring Boot v3 is no longer supported. +```yaml + - transformDataType: + toType: google-mail:draft + - to: + uri: google-mail:drafts/create + parameters: + inBody: content + applicationName: camel-email-triage + userId: me +``` -### Camel Jackson 3 Components +A full example using these transformers to build an AI email triage agent is available in [this blog post](/blog/2026/04/email-triage-agent/). -Four new components have been added which provide Jackson 3 support - they are named similarly to the previously existing camel-jackson components. Jackson 3 operates under a different package name (tools.jackson.* vs. com.fasterxml.jackson) and there are a number of API changes between Jackson 2 and Jackson 3. The [upgrade guide](/manual/camel-4x-upgrade-guide-4_19.html) has a lot of details on how to migrate your Camel application to Jackson 3. ## JDK25 compatibility From 310de9fa0335aa10b0a96f51fd44c33499468e98 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Fri, 17 Apr 2026 09:51:32 +0200 Subject: [PATCH 10/15] Whats new 4.19 --- .../blog/2026/04/camel419-whatsnew/index.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/content/blog/2026/04/camel419-whatsnew/index.md b/content/blog/2026/04/camel419-whatsnew/index.md index 17c34d0d2e8..ec1942cccb1 100644 --- a/content/blog/2026/04/camel419-whatsnew/index.md +++ b/content/blog/2026/04/camel419-whatsnew/index.md @@ -2,7 +2,7 @@ title: "Apache Camel 4.19 What's New" date: 2026-04-20 draft: false -authors: [ davsclaus, croway, squakez, cunningt ] +authors: [ davsclaus, croway, squakez, cunningt, zbendhiba ] categories: [ "Releases" ] preview: "Details of what we have done in the Camel 4.19 release." --- @@ -36,7 +36,7 @@ Added more functions to the simple language to work with list/map: - `mapRemove(source,key)` - Removes the key from the source expression as a map object. - `sort(exp,reverse)` - Sorts the message body or expression in natural order -And also new functions for JSon: +And also new functions for JSON: - `toPrettyJson(exp)` - Converts the expression to a JSon `String` representation. String values are returned as-is, null values return null, all other types are serialized to JSon in pretty mode. - `toPrettyJsonBody` - Converts the message body to a JSon `String` representation. String values are returned as-is, null values return null, all other types are serialized to JSon in pretty mode. @@ -118,10 +118,15 @@ Camel JBang can now easier run and export with JPA by automatic using Hibernates Removed exporting with Gradle as the build tool. Only Maven works reliable and is generally supported and recommended to be used. +The `camel transform route` command to YAML has been improved to support all EIPs, error handlers, interceptors, etc. + Added `camel wrapper` command that installs Camel Launcher with wrapper scripts (`camelw`) which allows to run Camel JBang (without JBang) using the Camel Launcher instead with the binary installed locally, just like Maven Wrapper. This ensures consistency and locked to use the installed version. +Added `camel-launcher-container` that allows to build a Docker image to make it easy to run Camel Launcher +using Docker or Podman. + ## Observability ### Meter logging on shutdown @@ -151,6 +156,8 @@ Upgraded to Kafka 4.2 client. ## Camel AI +The `camel-openai` component can now configure TLS/SSL using Camels Security Configuration. + ### MCP Client Support `camel-openai`, `camel-langchain4j-agent`, and `camel-spring-ai-chat` can now act as MCP clients, connecting to external MCP servers to discover and invoke tools during a conversation. @@ -256,6 +263,12 @@ We expect the next Camel 4.20 release to support Java 25. Upgraded many third-party dependencies to the latest releases at the time of release. +The `camel-ftp` component for sftp now supports Open SSH. + +The `camel-as2` component has many bug fixes and improvements to make it work better work other vendor systems. + +The `camel-graphql` component is not based on `camel-http` to allow more flexibility and configuration options. + ## New Components We have some new components to this release. @@ -280,6 +293,8 @@ Starting from this version we're deprecating the following components: - `camel-tracing` based components (`camel-opentelemetry`, `camel-observation`): replaced by `camel-telemetry` components (`camel-opentelemetry2`, `camel-micrometer-observability`). - Old MDC technology (`camel.main.useMdcLogging = true`): replaced by `camel-mdc` service. +- `camel-csimple` is deprecated, use `camel-simple`. +- `camel-json-patch` is deprecated. The project is not maintained. You're invited to move to the new components already in this version. From d7497f5348a25c08e3d5aaab2b1835130cdfad03 Mon Sep 17 00:00:00 2001 From: Andrea Cosentino Date: Fri, 17 Apr 2026 09:55:13 +0200 Subject: [PATCH 11/15] Add Camel MCP Server section to 4.19 What's New blog post Signed-off-by: Andrea Cosentino --- .../blog/2026/04/camel419-whatsnew/index.md | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/content/blog/2026/04/camel419-whatsnew/index.md b/content/blog/2026/04/camel419-whatsnew/index.md index ec1942cccb1..25f5ef042ea 100644 --- a/content/blog/2026/04/camel419-whatsnew/index.md +++ b/content/blog/2026/04/camel419-whatsnew/index.md @@ -127,6 +127,53 @@ the installed version. Added `camel-launcher-container` that allows to build a Docker image to make it easy to run Camel Launcher using Docker or Podman. +### MCP Server + +The Camel MCP Server, [introduced as a Preview in 4.18](/blog/2026/02/camel-jbang-mcp/), received significant improvements in this release. + +#### New Tools + +Three new tools have been added, bringing the total to 19: + +- **`camel_error_diagnose`** -- Accepts Camel stack traces or error messages and returns structured diagnosis including the identified component/EIP, common causes, documentation links, and suggested fixes. Covers 17 known Camel exceptions such as `NoSuchEndpointException`, `ResolveEndpointFailedException`, and `FailedToCreateRouteException`. +- **`camel_dependency_check`** -- Analyzes a project's `pom.xml` and optional route definitions to detect outdated Camel versions, missing Maven dependencies for components used in routes, and version conflicts between the Camel BOM and explicit dependency overrides. Returns actionable recommendations with corrected Maven dependency snippets. +- **`camel_route_test_scaffold`** -- Generates JUnit 5 test skeletons from YAML or XML Camel route definitions, including `CamelTestSupport` / `@CamelSpringBootTest` setup, mock endpoints, `@RegisterExtension` stubs for 20+ test-infra services, `NotifyBuilder` for timer-based routes, and required Maven dependency listings. + +#### MCP Prompts and Resources + +We added support for **MCP Prompts**, enabling structured multi-step workflows within AI assistants, and **MCP Resources** which expose the exception catalog as a standalone queryable resource with version-aware documentation links. + +#### Architecture Improvements + +- **Shared CatalogService with caching** -- A shared `CatalogService` with caching and version parameters has been added to all catalog tools, improving performance and consistency. +- **Tool annotations** -- All 27 tool methods across 12 tool classes now carry `@Tool.Annotations(readOnlyHint=true, destructiveHint=false, openWorldHint=false)`, explicitly declaring to MCP clients that all tools are read-only. This enables auto-approval and better tool selection decisions in AI assistants. +- **Typed record return types** -- Refactored all tool classes to return typed Java records instead of manually built JSON strings, reducing ~130 lines of boilerplate code. +- **Configurable Maven repositories** -- Additional Maven repositories can now be configured for catalog resolution. + +#### Bug Fixes + +- Fixed `ClassNotFoundException` for `AbstractCamelCatalog` by adding an explicit `camel-catalog` dependency. +- Fixed `DefaultCamelCatalog.getCatalogVersion()` that was ignoring the `VersionManager` and returning the compiled-in version. +- Fixed `CatalogLoader.loadCatalog()` failure with `NoClassDefFoundError` for versioned catalogs. +- Added graceful handling with a clear error message when the Spring Boot catalog provider requires JDK 21+ (since camel-spring-boot 4.19.0 moved to Spring Boot 4). +- Fixed HTTP server port binding when `--port` is specified. + +To use the latest version, update your `.mcp.json` configuration: + +```json +{ + "mcpServers": { + "camel": { + "command": "jbang", + "args": [ + "-Dquarkus.log.level=WARN", + "org.apache.camel:camel-jbang-mcp:4.19.0:runner" + ] + } + } +} +``` + ## Observability ### Meter logging on shutdown From 4679ae0448993b491bb95eb7ff88bc58bcc72fbf Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Fri, 17 Apr 2026 10:33:06 +0200 Subject: [PATCH 12/15] Whats new 4.19 --- .../blog/2026/04/camel419-whatsnew/index.md | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/content/blog/2026/04/camel419-whatsnew/index.md b/content/blog/2026/04/camel419-whatsnew/index.md index 25f5ef042ea..519aa7a62d1 100644 --- a/content/blog/2026/04/camel419-whatsnew/index.md +++ b/content/blog/2026/04/camel419-whatsnew/index.md @@ -2,7 +2,7 @@ title: "Apache Camel 4.19 What's New" date: 2026-04-20 draft: false -authors: [ davsclaus, croway, squakez, cunningt, zbendhiba ] +authors: [ davsclaus, croway, squakez, cunningt, zbendhiba, oscerd ] categories: [ "Releases" ] preview: "Details of what we have done in the Camel 4.19 release." --- @@ -18,7 +18,11 @@ Spring Boot v3 is no longer supported. ### Camel Jackson 3 Components -Four new components have been added which provide Jackson 3 support - they are named similarly to the previously existing camel-jackson components. Jackson 3 operates under a different package name (tools.jackson.* vs. com.fasterxml.jackson) and there are a number of API changes between Jackson 2 and Jackson 3. The [upgrade guide](/manual/camel-4x-upgrade-guide-4_19.html) has a lot of details on how to migrate your Camel application to Jackson 3. +Four new components have been added which provide Jackson 3 support - they are named similarly to the previously existing camel-jackson components. +Jackson 3 operates under a different package name (`tools.jackson.*` vs `com.fasterxml.jackson`) and there are a number of +API changes between Jackson 2 and Jackson 3. + +The [upgrade guide](/manual/camel-4x-upgrade-guide-4_19.html) has a lot of details on how to migrate your Camel application to Jackson 3. ## Camel Core @@ -192,14 +196,14 @@ In this release we're introducing the possibility to trace Micrometer metrics wh You can use the wildcard `*` into your headers (`camel.mdc.customHeaders`) or properties (`camel.mdc.customProperties`) filter configuration, for example `CAMEL_HTTP_*` or `my_*_property` to select the values to include in your MDC logging trace. From now on you can spare some time and avoid to include all configuration one by one. +### Deprecated Observability components -## Camel Groovy - -The `camel-groovy` JAR now included `camel-groovy-json` and `camel-groovy-xml` all combined in a single dependency. +Starting from this version we're deprecating the following components: -## Camel Kafka +- `camel-tracing` based components (`camel-opentelemetry`, `camel-observation`): replaced by `camel-telemetry` components (`camel-opentelemetry2`, `camel-micrometer-observability`). +- Old MDC technology (`camel.main.useMdcLogging = true`): replaced by `camel-mdc` service. -Upgraded to Kafka 4.2 client. +You're invited to move to the new components already in this version. ## Camel AI @@ -301,10 +305,13 @@ The `google-mail:draft` transformer constructs a proper `Draft` object with emai A full example using these transformers to build an AI email triage agent is available in [this blog post](/blog/2026/04/email-triage-agent/). +## Camel Groovy -## JDK25 compatibility +The `camel-groovy` JAR now included `camel-groovy-json` and `camel-groovy-xml` all combined in a single dependency. -We expect the next Camel 4.20 release to support Java 25. +## Camel Kafka + +Upgraded to Kafka 4.2 client. ## Miscellaneous @@ -334,16 +341,9 @@ We have some new components to this release. - `camel-pgvector` - Perform operations on the PostgreSQL pgvector Vector Database. - `camel-spring-ai-image` - Spring AI Image Generation -## Deprecations - -Starting from this version we're deprecating the following components: - -- `camel-tracing` based components (`camel-opentelemetry`, `camel-observation`): replaced by `camel-telemetry` components (`camel-opentelemetry2`, `camel-micrometer-observability`). -- Old MDC technology (`camel.main.useMdcLogging = true`): replaced by `camel-mdc` service. -- `camel-csimple` is deprecated, use `camel-simple`. -- `camel-json-patch` is deprecated. The project is not maintained. +## JDK25 compatibility -You're invited to move to the new components already in this version. +We expect the next Camel 4.20 release to support Java 25. ## Upgrading From 391ff40264108b85093a08b7860d5e0534912d49 Mon Sep 17 00:00:00 2001 From: Andrea Cosentino Date: Fri, 17 Apr 2026 12:07:51 +0200 Subject: [PATCH 13/15] Add Post-Quantum Cryptography section to 4.19 What's New blog post Signed-off-by: Andrea Cosentino --- .../blog/2026/04/camel419-whatsnew/index.md | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/content/blog/2026/04/camel419-whatsnew/index.md b/content/blog/2026/04/camel419-whatsnew/index.md index 519aa7a62d1..0f698e66b33 100644 --- a/content/blog/2026/04/camel419-whatsnew/index.md +++ b/content/blog/2026/04/camel419-whatsnew/index.md @@ -105,6 +105,62 @@ In YAML DSL then we have added support for configuring transformer and validator ``` +## Post-Quantum Cryptography (PQC) + +Camel 4.19 brings the most significant set of PQC enhancements since the `camel-pqc` component was introduced in 4.12, spanning hybrid cryptography, key lifecycle management, and platform-wide quantum-safe TLS readiness. + +### Hybrid Cryptography + +The headline feature is **hybrid cryptography** -- combining a classical algorithm with a post-quantum algorithm for defense-in-depth during the quantum transition period. + +New hybrid operations: + +- `hybridSign` / `hybridVerify` -- combines a classical signature (ECDSA, Ed25519, RSA) with a PQC signature (ML-DSA, SLH-DSA, etc.). +- `hybridGenerateSecretKeyEncapsulation` / `hybridExtractSecretKeyEncapsulation` / `hybridExtractSecretKeyFromEncapsulation` -- combines a classical key agreement (ECDH, X25519, X448) with a PQC KEM (ML-KEM, etc.). + +Default material classes make getting started straightforward, for example `PQCDefaultECDSAMLDSAMaterial` (ECDSA + ML-DSA) or `PQCDefaultX25519MLKEMMaterial` (X25519 + ML-KEM). The KDF used to combine secrets is configurable (HKDF-SHA256/384/512), and algorithm metadata is embedded in the wire format so the receiver can determine which combination was used. + +### Key Lifecycle Management + +Key lifecycle operations now work end-to-end through the PQC producer: `generateKeyPair`, `rotateKey`, `exportKey`, `importKey`, `getKeyMetadata`, `listKeys`, `expireKey`, `revokeKey`, and more. Three backends are available: + +- `FileBasedKeyLifecycleManager` (local file system, now using PKCS#8/X.509 serialization instead of Java object serialization) +- `HashicorpVaultKeyLifecycleManager` +- `AwsSecretsManagerKeyLifecycleManager` + +A new `strictKeyLifecycle` option (default: `true`) enforces key status -- REVOKED keys are rejected for all operations, EXPIRED keys are rejected for signing/encapsulation but allowed for verification, and DEPRECATED keys produce a warning. + +### Stateful Key Usage Tracking + +For hash-based signature schemes (XMSS, XMSSMT, LMS/HSS) where key reuse is dangerous, a new tracking system warns when remaining signatures drop below a configurable threshold (`statefulKeyWarningThreshold`, default 10%) and throws an exception when signatures are exhausted. A `PQCStatefulKeyHealthCheck` Camel Health Check reports DOWN when capacity is low. + +### PQC TLS Auto-Configuration + +On **JDK 25+**, Camel now automatically configures TLS named groups with PQC preference: + +``` +X25519MLKEM768, x25519, secp256r1, secp384r1, [remaining JVM defaults] +``` + +This activates only when the user has not explicitly set `namedGroups` or `namedGroupsFilter`, and is fully backward-compatible with peers that do not support PQC. + +New `namedGroups`, `namedGroupsFilter`, `signatureSchemes`, and `signatureSchemesFilter` options have been added to `SSLContextParameters`, and are also configurable via properties: + +```properties +camel.ssl.namedGroups = X25519MLKEM768,x25519,secp256r1,secp384r1 +camel.ssl.signatureSchemes = ML-DSA,ECDSA,RSA +``` + +PQC TLS readiness has been applied across the platform, including camel-netty, camel-netty-http (changed from "TLS" to "TLSv1.3" with PQC named groups on JDK 25+), and camel-mongodb (fixed hardcoded TLSv1.2 to allow TLS 1.3 with PQC and added `SSLContextParameters` support). + +### Input Validation and Documentation + +Startup validation now checks symmetric key lengths for KEM operations across 15 symmetric algorithms, warns about non-recommended hybrid combinations (e.g., RSA in hybrid signatures), and logs NIST parameter set guidance for ML-KEM, ML-DSA, and SLH-DSA. + +The PQC dataformat has been registered in the DSL model, enabling `marshal().pqc()` in Java DSL and full YAML DSL schema support. + +Comprehensive documentation has been added covering PQC usage with the Crypto (Digital Signature) EIP, PQC TLS configuration, auto-configuration, and migration guidance. + ## Camel JBang The output from the Camel JBang commands is now better fit within the current terminal width. From 2f6240178ba26c25e7eedfa57751bcd08094fb0a Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Fri, 17 Apr 2026 13:05:14 +0200 Subject: [PATCH 14/15] Whats new 4.19 --- .../blog/2026/04/camel419-whatsnew/index.md | 71 +++++++++---------- 1 file changed, 32 insertions(+), 39 deletions(-) diff --git a/content/blog/2026/04/camel419-whatsnew/index.md b/content/blog/2026/04/camel419-whatsnew/index.md index 0f698e66b33..1430c98c2cc 100644 --- a/content/blog/2026/04/camel419-whatsnew/index.md +++ b/content/blog/2026/04/camel419-whatsnew/index.md @@ -187,6 +187,38 @@ the installed version. Added `camel-launcher-container` that allows to build a Docker image to make it easy to run Camel Launcher using Docker or Podman. + +## Observability + +### Meter logging on shutdown + +In this release we're introducing the possibility to trace Micrometer metrics when the application is shutting down. When you have a controlled shutdown (for example, a cronjob executing) or a shutdown produced by any fatal error you are in a situation where your last metrics you may have not been able to scrape are lost. From now on you can enable the feature `camel.metrics.logMetricsOnShutdown=true` (and `camel.metrics.logMetricsOnShutdownFilters=camel.exchanges.*`, default `*`) and be able to store those values for any post mortem evaluation (for example when your Kubernetes Pod is stopping gracefully or crashed): + +```bash +2026-03-02 10:50:13.021 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : Micrometer component is stopping, here a list of metrics collected so far. +... +2026-03-02 10:50:13.050 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : {"name":"camel.exchanges.succeeded","type":"counter","value":0.0,"tags":{"routeId":"","kind":"CamelRoute","camelContext":"camel-1","eventType":"context"}} +2026-03-02 10:50:13.050 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : {"name":"camel.exchanges.failed","type":"counter","value":0.0,"tags":{"routeId":"","kind":"CamelRoute","camelContext":"camel-1","eventType":"context"}} +2026-03-02 10:50:13.050 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : {"name":"camel.exchanges.total","type":"counter","value":0.0,"tags":{"routeId":"","kind":"CamelRoute","camelContext":"camel-1","eventType":"context"}} +``` + +### MDC Service wildcard filter + +You can use the wildcard `*` into your headers (`camel.mdc.customHeaders`) or properties (`camel.mdc.customProperties`) filter configuration, for example `CAMEL_HTTP_*` or `my_*_property` to select the values to include in your MDC logging trace. From now on you can spare some time and avoid to include all configuration one by one. + +### Deprecated Observability components + +Starting from this version we're deprecating the following components: + +- `camel-tracing` based components (`camel-opentelemetry`, `camel-observation`): replaced by `camel-telemetry` components (`camel-opentelemetry2`, `camel-micrometer-observability`). +- Old MDC technology (`camel.main.useMdcLogging = true`): replaced by `camel-mdc` service. + +You're invited to move to the new components already in this version. + +## Camel AI + +The `camel-openai` component can now configure TLS/SSL using Camels Security Configuration. + ### MCP Server The Camel MCP Server, [introduced as a Preview in 4.18](/blog/2026/02/camel-jbang-mcp/), received significant improvements in this release. @@ -210,14 +242,6 @@ We added support for **MCP Prompts**, enabling structured multi-step workflows w - **Typed record return types** -- Refactored all tool classes to return typed Java records instead of manually built JSON strings, reducing ~130 lines of boilerplate code. - **Configurable Maven repositories** -- Additional Maven repositories can now be configured for catalog resolution. -#### Bug Fixes - -- Fixed `ClassNotFoundException` for `AbstractCamelCatalog` by adding an explicit `camel-catalog` dependency. -- Fixed `DefaultCamelCatalog.getCatalogVersion()` that was ignoring the `VersionManager` and returning the compiled-in version. -- Fixed `CatalogLoader.loadCatalog()` failure with `NoClassDefFoundError` for versioned catalogs. -- Added graceful handling with a clear error message when the Spring Boot catalog provider requires JDK 21+ (since camel-spring-boot 4.19.0 moved to Spring Boot 4). -- Fixed HTTP server port binding when `--port` is specified. - To use the latest version, update your `.mcp.json` configuration: ```json @@ -234,37 +258,6 @@ To use the latest version, update your `.mcp.json` configuration: } ``` -## Observability - -### Meter logging on shutdown - -In this release we're introducing the possibility to trace Micrometer metrics when the application is shutting down. When you have a controlled shutdown (for example, a cronjob executing) or a shutdown produced by any fatal error you are in a situation where your last metrics you may have not been able to scrape are lost. From now on you can enable the feature `camel.metrics.logMetricsOnShutdown=true` (and `camel.metrics.logMetricsOnShutdownFilters=camel.exchanges.*`, default `*`) and be able to store those values for any post mortem evaluation (for example when your Kubernetes Pod is stopping gracefully or crashed): - -```bash -2026-03-02 10:50:13.021 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : Micrometer component is stopping, here a list of metrics collected so far. -... -2026-03-02 10:50:13.050 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : {"name":"camel.exchanges.succeeded","type":"counter","value":0.0,"tags":{"routeId":"","kind":"CamelRoute","camelContext":"camel-1","eventType":"context"}} -2026-03-02 10:50:13.050 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : {"name":"camel.exchanges.failed","type":"counter","value":0.0,"tags":{"routeId":"","kind":"CamelRoute","camelContext":"camel-1","eventType":"context"}} -2026-03-02 10:50:13.050 INFO 269172 --- [ main] icrometer.json.AbstractMicrometerService : {"name":"camel.exchanges.total","type":"counter","value":0.0,"tags":{"routeId":"","kind":"CamelRoute","camelContext":"camel-1","eventType":"context"}} -``` - -### MDC Service wildcard filter - -You can use the wildcard `*` into your headers (`camel.mdc.customHeaders`) or properties (`camel.mdc.customProperties`) filter configuration, for example `CAMEL_HTTP_*` or `my_*_property` to select the values to include in your MDC logging trace. From now on you can spare some time and avoid to include all configuration one by one. - -### Deprecated Observability components - -Starting from this version we're deprecating the following components: - -- `camel-tracing` based components (`camel-opentelemetry`, `camel-observation`): replaced by `camel-telemetry` components (`camel-opentelemetry2`, `camel-micrometer-observability`). -- Old MDC technology (`camel.main.useMdcLogging = true`): replaced by `camel-mdc` service. - -You're invited to move to the new components already in this version. - -## Camel AI - -The `camel-openai` component can now configure TLS/SSL using Camels Security Configuration. - ### MCP Client Support `camel-openai`, `camel-langchain4j-agent`, and `camel-spring-ai-chat` can now act as MCP clients, connecting to external MCP servers to discover and invoke tools during a conversation. From 1c111456b2db01b4d9c3327386529c4fc12e4fb7 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Fri, 17 Apr 2026 13:47:22 +0200 Subject: [PATCH 15/15] Whats new 4.19 --- content/blog/2026/04/camel419-whatsnew/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2026/04/camel419-whatsnew/index.md b/content/blog/2026/04/camel419-whatsnew/index.md index 1430c98c2cc..7f237d8623e 100644 --- a/content/blog/2026/04/camel419-whatsnew/index.md +++ b/content/blog/2026/04/camel419-whatsnew/index.md @@ -1,6 +1,6 @@ --- title: "Apache Camel 4.19 What's New" -date: 2026-04-20 +date: 2026-04-17 draft: false authors: [ davsclaus, croway, squakez, cunningt, zbendhiba, oscerd ] categories: [ "Releases" ]