最近,我开始考虑使用Fuse Camel,Drools WB和Kie Execution Server Integration进行新项目,我遇到了以下问题。
我正在使用Fuse 6.2,Drool 6.2.Final for WB and Kie Server。
这就是我所做的:
1)从Drools-WB中的Fuse示例创建Person Drink流口水规则,并使用我自己的容器:myCheese在Kie Execution Server上部署。
2)在Fuse Camel中,我没有调用内部Kie-Camel服务器,而是使用一个bean来设置Comel-jetty的标头来触发规则:
public void populateRestHeader(Exchange exchange) {
// 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> <name>john</name> "
+ "<age>51</age> </org.drools.camel.example.Person> </insert> "
+ "<fire-all-rules/> </batch-execution>";
// 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:
jetty: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:] 在org.jboss.resteasy.core.registry.SegmentNode.match(SegmentNode.java:114)[resteasy-jaxrs-3.0.10.Final.jar:]
“内容类型”设置不正确还是未发送正文?
5)我尝试使用相同的方法执行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>
6)使用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;
}
但是我在Fuse日志中得到了Exception:
引起:org.kie.internalapi [281]找不到java.lang.ClassNotFoundException:org.drools.core.runtime.help.impl.BatchExecutionHelperProviderImpl 在org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1556) 在org.apache.felix.framework.BundleWiringImpl.access $ 400(BundleWiringImpl.java:77) 在org.apache.felix.framework.BundleWiringImpl $ BundleClassLoader.loadClass(BundleWiringImpl.java:1993)
好像Kie-Internal Package无法访问Drools-Core捆绑包?
感谢任何建议或帮助。
非常感谢
亚历
答案 0 :(得分:0)
Arr ..得到了答案的一半。
我需要设置Exchange.ContentType =&#34; application / xml&#34; !
现在可以在Fuse服务器和远程Kie-server之间很好地工作。但是,我仍然遇到BatchExecutionHelper Exception的问题。