Hi See the upgrade guide https://camel.apache.org/manual/latest/camel-3x-upgrade-guide-3_9.html#_exchange_properties
On Tue, Apr 20, 2021 at 11:44 PM Carl van Denzen <c...@vandenzen.nl> wrote: > > Hi, > > It looks like something has changed between Camel 3.8.0 and 3.9.0 with > Groovy or CamelLoopIndex. > > Up to and including Camel 3.8.0 my route succesfully runs the loop. > > In Camel 3.9.0 the loop fails. A wild guess is that something changed in > accessing exchange.properties.CamelLoopIndex. > > Does anyone know how to solve this? > > Steps to reproduce: > > Start Karaf V4.3.1 > > repo-add camel 3.9.0 > > feature:install camel > > feature:install camel-groovy > > Then copy the blueprint.xml to the Karaf deploy directory and look at > the Karaf log (log:display or log:tail). > > Excerpt of logging: > > 23:37:49.260 INFO [Camel (simple) thread #1 - timer://inittimer] > getOHItems body= > 23:37:49.262 INFO [Camel (simple) thread #1 - timer://inittimer] > getOHItems OHItems=[Ljava.lang.String;@53870163 > 23:37:49.310 INFO [Camel (simple) thread #1 - timer://inittimer] > getOHItems: OHItemsResult=[Ljava.lang.String;@53870163 > 23:37:49.321 INFO [Camel (simple) thread #1 - timer://inittimer] > getOHItems: OHItemsResultlength=4 > 23:37:49.419 ERROR [Camel (simple) thread #1 - timer://inittimer] Failed > delivery for (MessageId: EA6BC0C06725249-0000000000000002 on ExchangeId: > EA6BC0C06725249-0000000000000002). Exhausted after delivery attempt: 1 > caught: groovy.lang.GroovyRuntimeException: Ambiguous method overloading > for method [Ljava.lang.String;#getAt. > Cannot resolve which method to invoke for [null] due to overlapping > prototypes between: > [interface groovy.lang.Range] > [interface java.util.Collection] > > Message History (complete message history is disabled) > --------------------------------------------------------------------------------------------------------------------------------------- > RouteId ProcessorId Processor Elapsed (ms) > [start1 ] [start1 ] > [from[timer://inittimer?repeatCount=1] ] [ 811] > ... > [getOHItems ] [setHeader2 ] [setHeader[OHItem] ] [ 0] > > Stacktrace > --------------------------------------------------------------------------------------------------------------------------------------- > > groovy.lang.GroovyRuntimeException: Ambiguous method overloading for > method [Ljava.lang.String;#getAt. > Cannot resolve which method to invoke for [null] due to overlapping > prototypes between: > [interface groovy.lang.Range] > [interface java.util.Collection] > at > groovy.lang.MetaClassImpl.doChooseMostSpecificParams(MetaClassImpl.java:3338) > ~[!/:3.0.3] > at > groovy.lang.MetaClassImpl.chooseMostSpecificParams(MetaClassImpl.java:3314) > ~[!/:3.0.3] > at > groovy.lang.MetaClassImpl.chooseMethodInternal(MetaClassImpl.java:3304) > ~[!/:3.0.3] > at > groovy.lang.MetaClassImpl.chooseMethod(MetaClassImpl.java:3248) ~[!/:3.0.3] > at > groovy.lang.MetaClassImpl.getMethodWithCachingInternal(MetaClassImpl.java:1402) > ~[!/:3.0.3] > at > groovy.lang.MetaClassImpl.createPojoCallSite(MetaClassImpl.java:3485) > ~[!/:3.0.3] > at > org.codehaus.groovy.runtime.callsite.CallSiteArray.createPojoSite(CallSiteArray.java:123) > ~[!/:3.0.3] > at > org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:160) > ~[!/:3.0.3] > at > org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) > ~[!/:3.0.3] > at > org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) > ~[!/:3.0.3] > at > org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139) > ~[!/:3.0.3] > at > Script_79c547dcc1121c0ac97f26e7a65ca1f4.run(Script_79c547dcc1121c0ac97f26e7a65ca1f4.groovy:1) > ~[?:?] > at > org.apache.camel.language.groovy.GroovyExpression.evaluate(GroovyExpression.java:52) > ~[!/:3.9.0] > at > org.apache.camel.processor.SetHeaderProcessor.process(SetHeaderProcessor.java:48) > [!/:3.9.0] > at > org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:439) > [!/:3.9.0] > at > org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:181) > [!/:3.9.0] > at > org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:62) > [!/:3.9.0] > at > org.apache.camel.processor.Pipeline.process(Pipeline.java:167) [!/:3.9.0] > at > org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:388) > [!/:3.9.0] > at > org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:209) > [!/:3.9.0] > at > org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:76) > [!/:3.9.0] > at java.util.TimerThread.mainLoop(Timer.java:556) [?:?] > at java.util.TimerThread.run(Timer.java:506) [?:?] > 23:37:49.426 WARN [Camel (simple) thread #1 - timer://inittimer] Error > processing exchange. Exchange[EA6BC0C06725249-0000000000000002]. Caused > by: [groovy.lang.GroovyRuntimeException - Ambiguous method overloading > for method [Ljava.lang.String;#getAt. > > ===================================================================================================================== > > For the same test in Camel 3.8.0 do the following: > > Stop Karaf > > rm -rf data > > Start Karaf > > repo-add camel 3.8.0 > > feature:install camel > > feature:install camel-groovy > > Excerpt of logging: > > > 23:34:09.633 INFO [Camel (simple) thread #1 - timer://inittimer] > getOHItems body= > 23:34:09.635 INFO [Camel (simple) thread #1 - timer://inittimer] > getOHItems OHItems=[Ljava.lang.String;@60288c1f > 23:34:09.694 INFO [Camel (simple) thread #1 - timer://inittimer] > getOHItems: OHItemsResult=[Ljava.lang.String;@60288c1f > 23:34:09.704 INFO [Camel (simple) thread #1 - timer://inittimer] > getOHItems: OHItemsResultlength=4 > 23:34:09.800 INFO [Camel (simple) thread #1 - timer://inittimer] header > OHItem is f1_nw_display_backlight_min > 23:34:09.814 INFO [Camel (simple) thread #1 - timer://inittimer] header > OHItem is f1_nw_display_backlight_max > 23:34:09.814 INFO [Camel (simple) thread #1 - timer://inittimer] header > OHItem is f1_nw_display_backlight_bias > 23:34:09.815 INFO [Camel (simple) thread #1 - timer://inittimer] header > OHItem is f1_nw_display_backlight_multiplier > > ====================================================================================================================== > > blueprint.xml (for the curious: OH is for OpenHab): > > <?xml version="1.0" encoding="UTF-8"?> > <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xsi:schemaLocation=" > http://www.osgi.org/xmlns/blueprint/v1.0.0 > https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd > http://camel.apache.org/schema/blueprint > http://camel.apache.org/schema/blueprint/camel-blueprint.xsd"> > > > <camelContext xmlns="http://camel.apache.org/schema/blueprint" > id="simple"> > <route id="t14"> > <from uri="timer:simple?repeatCount=1"/> > <setBody> > <simple>Hello World</simple> > </setBody> > <log message="${body}"/> > </route> > > > <!-- ** Multiple items. > Input: header OHItems, array of Strings (names of items) > Output: body, array of Strings --> > <route id="getOHItems" autoStartup="true" streamCache="true"> > <from uri="direct:getOHItems"/> > <log message="getOHItems body=${body}"/> > <log message="getOHItems OHItems=${header.OHItems}"/> > <setHeader name="OHItemsResult"> > <groovy>new String[request.headers.OHItems.length]</groovy> > </setHeader> > <log message="getOHItems: OHItemsResult=${headers.OHItems}"/> > <log message="getOHItems: > OHItemsResultlength=${headers.OHItems.length}"/> > <loop> > <groovy>result=request.headers.OHItems.length</groovy> > <!-- log message="getOHItems: > CamelLoopIndex=exchange.properties.CamelLoopIndex"/ --> > <setHeader name="OHItem"> > <groovy>request.headers.OHItems[exchange.properties.CamelLoopIndex]</groovy> > </setHeader> > <log message="header OHItem is ${header.OHItem}"/> > <!-- Result is in body --> > <setHeader name="dummy"> > <groovy>request.headers.OHItemsResult[exchange.properties.CamelLoopIndex]=request.body</groovy> > </setHeader> > </loop> > <setBody> > <groovy>request.headers.OHItemsResult</groovy> > </setBody> > </route> > > <route id="start1" autoStartup="true"> > <from uri="timer:inittimer?repeatCount=1"/> > <setHeader name="OHItems"> > <groovy>new > String[]{"f1_nw_display_backlight_min","f1_nw_display_backlight_max", > "f1_nw_display_backlight_bias","f1_nw_display_backlight_multiplier"} > </groovy> > </setHeader> > <to uri="direct:getOHItems"/> > </route> > > </camelContext> > </blueprint> > > > Operating system Debian > > Java -version > > openjdk version "11.0.9.1" 2020-11-04 > OpenJDK Runtime Environment (build 11.0.9.1+1-post-Debian-1deb10u2) > OpenJDK 64-Bit Server VM (build 11.0.9.1+1-post-Debian-1deb10u2, mixed > mode, sharing) > -- Claus Ibsen ----------------- http://davsclaus.com @davsclaus Camel in Action 2: https://www.manning.com/ibsen2