Apache camel jboss fuse xquery自定义函数

Apache camel jboss fuse xquery自定义函数,apache-camel,xquery,jbossfuse,Apache Camel,Xquery,Jbossfuse,我们有一些现有的XQuery,希望在新的JBoss fuse集成应用程序中重复使用。作为其中的一部分,我尝试使用JBoss Fuse 6.3的XQuery组件。我的问题是如何将参数传递给XQuery函数。这是我的骆驼上下文 <camelContext id="dataConsumer-context" xmlns="http://camel.apache.org/schema/blueprint"> <propertyPlaceholder id="properties

我们有一些现有的XQuery,希望在新的JBoss fuse集成应用程序中重复使用。作为其中的一部分,我尝试使用JBoss Fuse 6.3的XQuery组件。我的问题是如何将参数传递给XQuery函数。这是我的骆驼上下文

<camelContext id="dataConsumer-context" xmlns="http://camel.apache.org/schema/blueprint">
    <propertyPlaceholder id="properties" location="classpath:sql.properties"/>
    <route id="consumer-route">
        <from id="_from1" uri="activemq:queue:house"/>
        <log id="inputMessage" message="Got ${body}"/>
        <to id="_to1" uri="xquery:myXquery.xquery"/>
        <log id="transformedMessgae" message="Got ${body}"/>
        <to id="_to2" uri="sql:{{sql.insertIntoMessage}}"/>
        <log id="_log2" message="Message is inserted into DB"/>
    </route>
</camelContext>

如果有人能回答我的问题,我将不胜感激。

您的XQuery可以看到Camel Exchange中的所有内容。例如,您可以将所需的参数作为头放在Camel路由中,然后在XQuery中将它们定义为
将变量$in.headers.myArgumentKey声明为xs:string external$in.headers.myArgumentKey”

”:

正文作为根元素传递给XQuery组件。 假设我有一个身体

<Auth>
  <userName>JohnDoe</userName>
  <userPassword>abcd1234</userPassword>
</Auth>

约翰多
abcd1234
然后我可以让XQuery对其进行转换,它可能看起来像:

declare variable $in.headers.referenceId as xs:string external;

declare function transformRequest($requestBody as element()) as element() {

  <newRequest>
     <RqUID>{$in.headers.referenceId}</ser:RqUID>
     <UserPrincipal>{$requestBody/userName/text()}</UserPrincipal>
     <UserCredentials>{$requestBody/userPassword/text()}</UserCredentials>
  </newRequest>

};      

let $request := /*[1]
return buildNewRequest($request)
将变量$in.headers.referenceId声明为xs:string-external;
将函数transformRequest($requestBody as element())声明为element(){
{$in.headers.referenceId}
{$requestBody/userName/text()}
{$requestBody/userPassword/text()}
};      
let$request:=/*[1]
返回buildNewRequest($request)
如您所见,let$request:=/*[1]
将内部变量
$request
设置为消息正文的根元素


PS.
$in.headers.referenceId
是一个变量,在调用我的XQuery之前,我可以在驼峰路径中将其设置为headers

感谢Gerry的响应。让我试一试如果您想将xml放入消息头中,这取决于xml来自何处。如果在使用Camel从文件、数据库、队列或其他端点读取xml后,xml在exchange中,则可以在Camel路由中直接使用`setHeader(“parmName”,simple(${body}'))。或者您可以使用如下常量:“setHeader(“parmName”),constant(“helloworld”)。我想作为参数传递给XQuery的xml在我的类路径中。我尝试了这个方法,但没有成功classpath:PaymentConstants.xml您有一些选择可以使用Camel从类路径加载资源。您可以使用“Simple”语言,并执行如下操作:
.setHeader(“myXML”).Simple(“resource:classpath:myXML.xml”)
或使用comp;onent:
.to(“language:simple:classpath:foopath/myXML.xml”)
然后将其移动到所需的标题或属性。感谢Gerry,我能够在标题中设置xml。但是当我尝试在xquery中使用它时,我得到了以下错误:“变量$in.headers.pmtConstants的值的必需项类型为element();提供的值的项类型为xs:untypedAtomic”。我在xquery中将其声明为“将变量$in.headers.pmtConstants声明为元素(*)external;”。感谢Vadim的响应。我真的很感激。对于简单的常量值,它是有效的。我想在我的XQuery中使用xml作为参数,知道如何在标题中设置xml吗?对不起,我很久没有使用Camel XQuery组件了。我更喜欢POJO格式,而是使用Java对象。但是,您可以尝试将外部变量定义为element(),然后将header传递为DOMSource或DOM Node等。。。标题实际上包含一个对象,它可以是任何东西。。。看,重用旧的XQuery已经有问题了。。。这是我不走这条路的原因之一。也许用Java重写它们要简单得多,而不是用很多技巧让它们工作。。。而性能是一个主要问题。它根本无法与Java相比。
declare variable $in.headers.referenceId as xs:string external;

declare function transformRequest($requestBody as element()) as element() {

  <newRequest>
     <RqUID>{$in.headers.referenceId}</ser:RqUID>
     <UserPrincipal>{$requestBody/userName/text()}</UserPrincipal>
     <UserCredentials>{$requestBody/userPassword/text()}</UserCredentials>
  </newRequest>

};      

let $request := /*[1]
return buildNewRequest($request)