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)

Reply via email to