【问题标题】:Apache Camel: Nested filters (filter ... filter ... end ...filter ... end ..end) in DSL (Groovy or Java)Apache Camel:DSL(Groovy 或 Java)中的嵌套过滤器(filter ... filter ... end ...filter ... end ..end)
【发布时间】:2013-05-15 08:38:35
【问题描述】:

骆驼路线的 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 中运行

感谢您的帮助

马库斯

【问题讨论】:

    标签: filter nested apache-camel dsl


    【解决方案1】:

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

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

    【讨论】:

    • 我认为这不适用于所示场景。我宁愿通过过滤器来解决它,我想我也需要。请解释一下我的示例实际上有什么问题?
    猜你喜欢
    • 2012-12-20
    • 2016-11-14
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    相关资源
    最近更新 更多