最近,我开始为一个新项目查看 Fuse Camel、Drools WB 和 Kie 执行服务器集成,但遇到以下问题。
我正在为 WB 和 Kie Server 使用 Fuse 6.2、Drool 6.2.Final。
这就是我所做的:
从 Drools-WB 中的 Fuse 示例创建 Person Drink drool 规则,并使用我自己的容器部署在 Kie 执行服务器上:myCheese。
在 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);
}
使用 jetty 将命令发布到远程 Kie-Server:
码头:http://my-server/services/rest/server/containers/myCheese
在 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:]
“内容类型”设置不正确或正文未发送?
- 我尝试使用相同的方法执行 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>
- 使用 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 捆绑包?