0

最近,我开始为一个新项目查看 Fuse Camel、Drools WB 和 Kie 执行服务器集成,但遇到以下问题。

我正在为 WB 和 Kie Server 使用 Fuse 6.2、Drool 6.2.Final。

这就是我所做的:

  1. 从 Drools-WB 中的 Fuse 示例创建 Person Drink drool 规则,并使用我自己的容器部署在 Kie 执行服务器上:myCheese。

  2. 在 Fuse Camel 中,我没有调用内部 Kie-Camel 服务器,而是使用一个 bean,在其中设置 Comel-jetty 的标头来触发规则:

    公共无效填充RestHeader(交换交换){

    // hard code the message for time being because   BatchExecutionHelperd doesn't work. please see below. 
    

    String myMessage = "<batch-execution lookup="ksession1"> " + "<insert out-identifier="person" > <org.drools.camel.example.Person> john " + "51 </org.drools.camel .example.Person> " + " ";

    // setup the login token
     exchange.getIn().setHeader("Authorization", basicToken);
    // POST so I can send XML.  GET works fine !
     exchange.getIn().setHeader(Exchange.HTTP_METHOD, "POST");
    // the content
     exchange.getIn().setHeader(Exchange.ACCEPT_CONTENT_TYPE, "application/xml");
     exchange.getIn().setBody(myMessage);
    

    }

  3. 使用 jetty 将命令发布到远程 Kie-Server:

    码头:http://my-server/services/rest/server/containers/myCheese

  4. 在 Kie-Server 日志中,我得到:

15:19:33,140 WARN [org.jboss.resteasy.core.ExceptionHandler](默认任务 114)未能执行:javax.ws.rs.NotSupportedException:无法使用 org.jboss.resteasy.core.registry 的内容类型。 SegmentNode.match(SegmentNode.java:380) [resteasy-jaxrs-3.0.10.Final.jar:] at org.jboss.resteasy.core.registry.SegmentNode.match(SegmentNode.java:114) [resteasy-jaxrs- 3.0.10.Final.jar:]

“内容类型”设置不正确或正文未发送?

  1. 我尝试使用相同的方法执行 GET,效果很好!

已收到 :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><response type="SUCCESS" msg="Info for container myCheese"><kie-container container-id="myCheese" status="STARTED"><release-id><artifact-id>mycheese</artifact-id><group-id>com.markit</group-id><version>1.0</version></release-id><resolved-release-id><artifact-id>mycheese</artifact-id><group-id>com.markit</group-id><version>1.0</version></resolved-release-id><scanner status="DISPOSED"/></kie-container></response>
  1. 使用 SoapUI 执行命令没有任何问题。

<response type="SUCCESS" msg="Container myCheese successfully called.">
<results><![CDATA[<execution-results>
  <result identifier="person">
    <org.drools.camel.example.Person>
      <name>john</name>
      <age>51</age>
      <canDrink>true</canDrink>
      <alive>false</alive>
      <sex></sex>
      <happy>false</happy>
    </org.drools.camel.example.Person>
  </result>
  <fact-handle identifier="person" external-form="0:1:866416565:866416565:1:DEFAULT:NON_TRAIT"/>
</execution-results>]]></results>
</response>

问题 :

a)有什么想法为什么会出错?将 Exchange.Body 设置为 POST 的 DATA 是否正确?b)不是使用 Came-Jetty 将命令发布到 Kie-Server,因为 Kie-Server 将其声明为 REST,我可以使用 CXFRS 来执行此操作吗?另外,我相信 Kie-Server 也支持 SOAP,但它的 WSDL 是什么?另一种选择?

c)对于 BatchExecutionCommands,我打算使用以下内容:

public String createCommand() {
    BatchExecutionCommandImpl command = new BatchExecutionCommandImpl();
    final List<GenericCommand<?>> commands = command.getCommands();
   
    Person person = createTestPerson();

    commands.add(new InsertObjectCommand(person, "myPerson"));
    commands.add(new FireAllRulesCommand());
    command.setLookup("ksession1");

    String myXMLMessage =     BatchExecutionHelper.newXStreamMarshaller().toXML(command);
    return myXMLMessage;
}

但是我在保险丝日志中得到了异常:

Caused by: java.lang.ClassNotFoundException: org.drools.core.runtime.help.impl.BatchExecutionHelperProviderImpl not found by org.kie.internalapi [281]
  at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1556)
  at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:77)
  at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1993)

似乎 Kie-Internal Package 无法访问 Drools-Core 捆绑包?

4

1 回答 1

0

Arr..得到了一半的答案。我需要设置

Exchange.ContentType = "应用程序/xml" !

现在可以在 Fuse 服务器和远程 Kie 服务器之间很好地工作。但是,我仍然遇到 BatchExecutionHelper 异常的问题。

于 2015-08-24T17:12:48.283 回答