1

Camel Routes 的 DSL 存在一些问题。似乎无法将以下 XML 配置转换为 Groovy(或 JAVA)DSL

    <route id="myroute" >
        <from uri="fromURI" />
        <filter>
            <xpath>//entity[contains(@destinations, 'databasedestination')]</xpath>
            <filter>
                <xpath>//entity[@objectType = 'objectType']</xpath>
                <camel:setHeader headerName="bodyTemp">
                    <simple>${body}</simple>
                </camel:setHeader>
                <filter>
                    <xpath>//entity[@command = 'add']</xpath>
                    <convertBodyTo type="com.foo.bar.Entity" />
                    <bean ref="handler" method="add" />
                </filter>
                <filter>
                    <xpath>//entity[@command = 'foo']</xpath>
                    <convertBodyTo type="com.foo.bar.Entity" />
                    <bean ref="handler" method="foo" />
                </filter>
                <filter>
                    <xpath>//entity[@command = 'bar']</xpath>
                    <convertBodyTo type="com.foo.bar.Entity" />
                    <bean ref="handler" method="bar" />
                </filter>
                <to uri="toURI" />      
            </filter>
        </filter>
    </route>

Wie 尝试在基于 Groovy 的 RouteBuilder 中将其翻译如下:

from("fromURI")
        .filter().xpath('//entity[contains(@destinations, \'databasedestination\')]')
            .setHeader("bodyTemp", simple('${body}'))
            .filter().xpath('//entity[@objectType = \'objectType\']')

                .filter().xpath('//entity[@command = \'add\']')
                    .convertBodyTo(com.foo.bar.Entity)
                    .bean(handler, "add")   
                .end()
                .filter().xpath('//entity[@command = \'foo\']')
                    .convertBodyTo(com.foo.bar.Entity)
                    .bean(handler, "foo")
                .end()
                .filter().xpath('//entity[@command = \'bar\']')
                    .convertBodyTo(com.foo.bar.Entity)
                    .bean(handler, "bar")
                .end()

                .to("toURI")
            .end()
        .end()  

但这显然行不通。我们收到一条javax.xml.xpath.XPathExpressionException消息:Invalid xpath: //entity[@command = 'foo']

另请参阅相应的堆栈跟踪。

    ->> 814 | doInEvaluateAs 在 org.apache.camel.builder.xml.XPathBuilder
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    | 第697章 评估如''
    | 139 | 火柴 。. . . . . 在 ''
    | 47 | org.apache.camel.processor.FilterProcessor 中的进程
    | 73 | 过程 。. . . . . 在 org.apache.camel.util.AsyncProcessorHelper
    | 99 | org.apache.camel.processor.DelegateAsyncProcessor 中的 processNext
    | 90 | 过程 。. . . . . 在 ''
    | 73 | org.apache.camel.management.InstrumentationProcessor 中的进程
    | 99 | 处理下一步。. . . 在 org.apache.camel.processor.DelegateAsyncProcessor
    | 90 | ''中的进程
    | 91 | 过程 。. . . . . 在 org.apache.camel.processor.interceptor.TraceInterceptor
    | 73 | org.apache.camel.util.AsyncProcessorHelper 中的进程
    | 330 | org.apache.camel.processor.RedeliveryErrorHandler 中的 processErrorHandler
    | 220 | ''中的进程
    | 45 | 处理下一步。. . . 在 org.apache.camel.processor.RouteContextProcessor
    | 90 | org.apache.camel.processor.DelegateAsyncProcessor 中的进程
    | 303 | 过程 。. . . . . 在 org.apache.camel.processor.interceptor.DefaultChannel
    | 73 | org.apache.camel.util.AsyncProcessorHelper 中的进程
    | 117 | 过程 。. . . . . 在 org.apache.camel.processor.Pipeline
    | 80 | ''中的进程
    | 45 | 处理下一步。. . . 在 org.apache.camel.processor.RouteContextProcessor
    | 90 | org.apache.camel.processor.DelegateAsyncProcessor 中的进程
    | 150 | 进程异步。. . 在 org.apache.camel.processor.UnitOfWorkProcessor
    | 117 | ''中的进程
    | 48 | 处理下一步。. . . 在 org.apache.camel.processor.RouteInflightRepositoryProcessor
    | 90 | org.apache.camel.processor.DelegateAsyncProcessor 中的进程
    | 73 | 过程 。. . . . . 在 org.apache.camel.util.AsyncProcessorHelper
    | 99 | org.apache.camel.processor.DelegateAsyncProcessor 中的 processNext
    | 90 | 过程 。. . . . . 在 ''
    | 73 | org.apache.camel.management.InstrumentationProcessor 中的进程
    | 99 | 过程 。. . . . . 在 org.apache.camel.util.AsyncProcessorHelper
    | 86 | org.apache.camel.processor.DelegateAsyncProcessor 中的进程
    | 105 | 消息。. . . . 在 org.apache.camel.component.jms.EndpointMessageListener
    | 1110 | java.util.concurrent.ThreadPoolExecutor 中的 runWorker
    | 603 | 跑 。. . . . . . . 在 java.util.concurrent.ThreadPoolExecutor$Worker
    ^ 722 | 在 java.lang.Thread 中运行
    由 XPathExpressionException 引起:null
    ->> 200 | 在 com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl 中评估
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    | 800 | doInEvaluateAs 在 org.apache.camel.builder.xml.XPathBuilder
    | 第697章 评估为。. . . 在 ''
    | 139 | 匹配 ''
    | 47 | 过程 。. . . . . 在 org.apache.camel.processor.FilterProcessor
    | 73 | org.apache.camel.util.AsyncProcessorHelper 中的进程
    | 99 | 处理下一步。. . . 在 org.apache.camel.processor.DelegateAsyncProcessor
    | 90 | ''中的进程
    | 73 | 过程 。. . . . . 在 org.apache.camel.management.InstrumentationProcessor
    | 99 | org.apache.camel.processor.DelegateAsyncProcessor 中的 processNext
    | 90 | 过程 。. . . . . 在 ''
    | 91 | org.apache.camel.processor.interceptor.TraceInterceptor 中的进程
    | 73 | 过程 。. . . . . 在 org.apache.camel.util.AsyncProcessorHelper
    | 330 | org.apache.camel.processor.RedeliveryErrorHandler 中的 processErrorHandler
    | 220 | 过程 。. . . . . 在 ''
    | 45 | org.apache.camel.processor.RouteContextProcessor 中的 processNext
    | 90 | 过程 。. . . . . 在 org.apache.camel.processor.DelegateAsyncProcessor
    | 303 | org.apache.camel.processor.interceptor.DefaultChannel 中的进程
    | 73 | 过程 。. . . . . 在 org.apache.camel.util.AsyncProcessorHelper
    | 117 | org.apache.camel.processor.Pipeline 中的进程
    | 80 | 过程 。. . . . . 在 ''
    | 45 | org.apache.camel.processor.RouteContextProcessor 中的 processNext
    | 90 | 过程 。. . . . . 在 org.apache.camel.processor.DelegateAsyncProcessor
    | 150 | org.apache.camel.processor.UnitOfWorkProcessor 中的 processAsync
    | 117 | 过程 。. . . . . 在 ''
    | 48 | org.apache.camel.processor.RouteInflightRepositoryProcessor 中的 processNext
    | 90 | 过程 。. . . . . 在 org.apache.camel.processor.DelegateAsyncProcessor
    | 73 | org.apache.camel.util.AsyncProcessorHelper 中的进程
    | 99 | 处理下一步。. . . 在 org.apache.camel.processor.DelegateAsyncProcessor
    | 90 | ''中的进程
    | 73 | 过程 。. . . . . 在 org.apache.camel.management.InstrumentationProcessor
    | 99 | org.apache.camel.util.AsyncProcessorHelper 中的进程
    | 86 | 过程 。. . . . . 在 org.apache.camel.processor.DelegateAsyncProcessor
    | 105 | org.apache.camel.component.jms.EndpointMessageListener 中的 onMessage
    | 1110 | 运行工人。. . . . 在 java.util.concurrent.ThreadPoolExecutor
    | 603 | 在 java.util.concurrent.ThreadPoolExecutor$Worker 中运行
    ^ 722 | 跑 。. . . . . . . 在 java.lang.Thread
    由 TransformerException 引起:无法使用此上下文评估表达式
    ->> 367 | 在 com.sun.org.apache.xpath.internal.XPath 中执行
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    | 129 | com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl 中的 eval
    | 105 | 评估。. . . . . . 在 ''
    | 187 | 在''中评估
    | 800 | doInEvaluateAs 。. 在 org.apache.camel.builder.xml.XPathBuilder
    | 第697章 评估如''
    | 139 | 火柴 。. . . . . 在 ''
    | 47 | org.apache.camel.processor.FilterProcessor 中的进程
    | 73 | 过程 。. . . . . 在 org.apache.camel.util.AsyncProcessorHelper
    | 99 | org.apache.camel.processor.DelegateAsyncProcessor 中的 processNext
    | 90 | 过程 。. . . . . 在 ''
    | 73 | org.apache.camel.management.InstrumentationProcessor 中的进程
    | 99 | 处理下一步。. . . 在 org.apache.camel.processor.DelegateAsyncProcessor
    | 90 | ''中的进程
    | 91 | 过程 。. . . . . 在 org.apache.camel.processor.interceptor.TraceInterceptor
    | 73 | org.apache.camel.util.AsyncProcessorHelper 中的进程
    | 330 | org.apache.camel.processor.RedeliveryErrorHandler 中的 processErrorHandler
    | 220 | ''中的进程
    | 45 | 处理下一步。. . . 在 org.apache.camel.processor.RouteContextProcessor
    | 90 | org.apache.camel.processor.DelegateAsyncProcessor 中的进程
    | 303 | 过程 。. . . . . 在 org.apache.camel.processor.interceptor.DefaultChannel
    | 73 | org.apache.camel.util.AsyncProcessorHelper 中的进程
    | 117 | 过程 。. . . . . 在 org.apache.camel.processor.Pipeline
    | 80 | ''中的进程
    | 45 | 处理下一步。. . . 在 org.apache.camel.processor.RouteContextProcessor
    | 90 | org.apache.camel.processor.DelegateAsyncProcessor 中的进程
    | 150 | 进程异步。. . 在 org.apache.camel.processor.UnitOfWorkProcessor
    | 117 | ''中的进程
    | 48 | 处理下一步。. . . 在 org.apache.camel.processor.RouteInflightRepositoryProcessor
    | 90 | org.apache.camel.processor.DelegateAsyncProcessor 中的进程
    | 73 | 过程 。. . . . . 在 org.apache.camel.util.AsyncProcessorHelper
    | 99 | org.apache.camel.processor.DelegateAsyncProcessor 中的 processNext
    | 90 | 过程 。. . . . . 在 ''
    | 73 | org.apache.camel.management.InstrumentationProcessor 中的进程
    | 99 | 过程 。. . . . . 在 org.apache.camel.util.AsyncProcessorHelper
    | 86 | org.apache.camel.processor.DelegateAsyncProcessor 中的进程
    | 105 | 消息。. . . . 在 org.apache.camel.component.jms.EndpointMessageListener
    | 1110 | java.util.concurrent.ThreadPoolExecutor 中的 runWorker
    | 603 | 跑 。. . . . . . . 在 java.util.concurrent.ThreadPoolExecutor$Worker
    ^ 722 | 在 java.lang.Thread 中运行
    由 RuntimeException 引起:无法使用此上下文评估表达式
    ->> 266 | com.sun.org.apache.xpath.internal.axes.NodeSequence 中的 setRoot
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    | 214 | 在 com.sun.org.apache.xpath.internal.axes.LocPathIterator 中执行
    | 339 | 执行 。. . . . . 在 com.sun.org.apache.xpath.internal.XPath
    | 129 | com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl 中的 eval
    | 105 | 评估。. . . . . . 在 ''
    | 187 | 在''中评估
    | 800 | doInEvaluateAs 。. 在 org.apache.camel.builder.xml.XPathBuilder
    | 第697章 评估如''
    | 139 | 火柴 。. . . . . 在 ''
    | 47 | org.apache.camel.processor.FilterProcessor 中的进程
    | 73 | 过程 。. . . . . 在 org.apache.camel.util.AsyncProcessorHelper
    | 99 | org.apache.camel.processor.DelegateAsyncProcessor 中的 processNext
    | 90 | 过程 。. . . . . 在 ''
    | 73 | org.apache.camel.management.InstrumentationProcessor 中的进程
    | 99 | 处理下一步。. . . 在 org.apache.camel.processor.DelegateAsyncProcessor
    | 90 | ''中的进程
    | 91 | 过程 。. . . . . 在 org.apache.camel.processor.interceptor.TraceInterceptor
    | 73 | org.apache.camel.util.AsyncProcessorHelper 中的进程
    | 330 | org.apache.camel.processor.RedeliveryErrorHandler 中的 processErrorHandler
    | 220 | ''中的进程
    | 45 | 处理下一步。. . . 在 org.apache.camel.processor.RouteContextProcessor
    | 90 | org.apache.camel.processor.DelegateAsyncProcessor 中的进程
    | 303 | 过程 。. . . . . 在 org.apache.camel.processor.interceptor.DefaultChannel
    | 73 | org.apache.camel.util.AsyncProcessorHelper 中的进程
    | 117 | 过程 。. . . . . 在 org.apache.camel.processor.Pipeline
    | 80 | ''中的进程
    | 45 | 处理下一步。. . . 在 org.apache.camel.processor.RouteContextProcessor
    | 90 | org.apache.camel.processor.DelegateAsyncProcessor 中的进程
    | 150 | 进程异步。. . 在 org.apache.camel.processor.UnitOfWorkProcessor
    | 117 | ''中的进程
    | 48 | 处理下一步。. . . 在 org.apache.camel.processor.RouteInflightRepositoryProcessor
    | 90 | org.apache.camel.processor.DelegateAsyncProcessor 中的进程
    | 73 | 过程 。. . . . . 在 org.apache.camel.util.AsyncProcessorHelper
    | 99 | org.apache.camel.processor.DelegateAsyncProcessor 中的 processNext
    | 90 | 过程 。. . . . . 在 ''
    | 73 | org.apache.camel.management.InstrumentationProcessor 中的进程
    | 99 | 过程 。. . . . . 在 org.apache.camel.util.AsyncProcessorHelper
    | 86 | org.apache.camel.processor.DelegateAsyncProcessor 中的进程
    | 105 | 消息。. . . . 在 org.apache.camel.component.jms.EndpointMessageListener
    | 1110 | java.util.concurrent.ThreadPoolExecutor 中的 runWorker
    | 603 | 跑 。. . . . . . . 在 java.util.concurrent.ThreadPoolExecutor$Worker
    ^ 722 | 在 java.lang.Thread 中运行

感谢您的任何帮助

马库斯

4

1 回答 1

0

您的代码似乎更适合基于内容的路由器,使用选择 EIP。

您是否可以使用选择语句来代替?http://camel.apache.org/content-based-router.html

于 2013-05-17T10:41:19.877 回答