jaxbkiedrools-kie-server

ServiceResponse Result is always null (JAXB, KIE Workbench & KIE Server 6.5.0)


I have a project setup in KIE Workbench, version 6.5.0 and a KIE execution server 6.5.0 running, all on the same local Wildfly 10. It is working fine. I have a simple rule that is being executed in a stateless KieSession, no process or whatsoever. I expect the rule to validate basic information and to add information about the fired validations to a global variable. In the example I am testing I just modify a global variable to see if it works, but for some reason I never get a result from the service, which I expect to have at least something.

This is the JAXB request I send:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<batch-execution lookup="kieSessionStateless">
    <insert disconnected="false" entry-point="DEFAULT" return-object="false" out-identifier="myorganization.myproject.bom.MyObject">
        <object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="myObject">
            <myDescription>description</myDescription>
            <myID>0</myID>
        </object>
    </insert>
    <set-global out-identifier="globalList" identifier="globalList">
        <object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="jaxbListWrapper">
            <type>LIST</type>
        </object>
    </set-global>
    <get-objects out-identifier="globalList"/>
    <fire-all-rules max="-1"/>
</batch-execution>

The rule that is executed is quite simple:

rule "MY FIRST RULE"

    when
        myorganization.myproject.bom.MyObject( myID == 0 )
    then
        myorganization.myproject.bom.GlobalResponses globalResponses = new myorganization.myproject.bom.GlobalResponses();
        globalResponses.setRuleName("MY FIRST RULE");
        globalResponses.setRuleResponse("MY ID IS 0");
        globalList.add(globalResponses);
        System.out.println("MY ID IS 0");

end

And in the Wildfly console I see the line printed without any additional information (like a stacktrace of an error), so I conclude all is working well:

13:04:36,315 INFO  [stdout] (default task-39) MY ID IS 0

But I always get the same response: it indicates that the "process" has terminated correctly (so it seems at first sight) and therefore I am expecting that Result has something (an empty xml response, an xml response with some data in it, ...):

System.out.println("Message: "+response.getMsg());
System.out.println("Result: "+response.getResult());
System.out.println("Type: "+response.getType());

Message: Container KieContainer successfully called.
Result: null
Type: SUCCESS
Response: ServiceResponse[SUCCESS, msg='Container KieContainer successfully called.']

The client is called with KieServicesClient:

KieServicesConfiguration config =  KieServicesFactory.
                newRestConfiguration(urlKieServer,
                    name,
                    password);
config.setMarshallingFormat(MarshallingFormat.JAXB); 
KieServicesClient client = KieServicesFactory.newKieServicesClient(config);  

JAXBContext jaxbContext = DroolsJaxbHelperProviderImpl.createDroolsJaxbContext(classNames, null);
Marshaller marshaller = jaxbContext.createMarshaller(); 
StringWriter xml = new StringWriter(); 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

marshaller.marshal(command, System.out);
marshaller.marshal(command, xml);

ServiceResponse<String> response = client.executeCommands("instances/"+containerName, xml.toString()); 

I am missing something but I really do not know what.

All the related projects are on GitHub. Since I cannot post more than two links, I will add the direct links in a comment.

This question is also on: Drools User group


Solution

  • I was able to complete the life cycle and send a valid request and obtain a valid answer. Part of my problem was the code used to construct the XML. The best way to construct a valid JAXB request is by using the API provided by KIE, an example can be found here.

    Anyway interested in establishing connection to a KIE Server 6.5.0 with a generic client project can consult the code on my GitHub.