0
votes

I am new to Kie Workbench and Execution Server. I am using Java Rest calls to run rules in kie workbench. Please find the code below:

private String kieServerUrl;
private String kieServerContainerId;
private String KieServerUsername;
private String kieServerPassword;

private RuleServicesClient ruleClient;

private static final String INPUT_OUT_IDENTIFIER = "Input";
private static final String SESSION_OBJECTS = "SessionObjects";
private static final String RUN_ALL_RULES = "RunAllRules";

public void init() {
    final KieServicesConfiguration config = KieServicesFactory.newRestConfiguration(kieServerUrl, KieServerUsername, kieServerPassword);
    config.setMarshallingFormat(MarshallingFormat.XSTREAM);     
    KieServicesClient kieServicesClient = KieServicesFactory.newKieServicesClient(config);
    ruleClient = kieServicesClient.getServicesClient(RuleServicesClient.class); 
}


@Override
public Output process(final Input input) {
    Output output = null;

    logger.debug("Running rules ..");

    BatchExecutionCommandImpl executionCommand = new BatchExecutionCommandImpl();

    executionCommand.getCommands().add(new InsertObjectCommand(input, INPUT_OUT_IDENTIFIER));
    executionCommand.getCommands().add(new FireAllRulesCommand(RUN_ALL_RULES));
    executionCommand.getCommands().add(new GetObjectsCommand(null, SESSION_OBJECTS));

    logger.debug("Sending commands to the server");

    ServiceResponse<ExecutionResults> response = ruleClient.executeCommandsWithResults(kieServerContainerId, executionCommand);

    if(response.getType().equals(ServiceResponse.ResponseType.SUCCESS)){
        logger.debug("Commands executed with success! Response: ");

        final ExecutionResultImpl result = (ExecutionResultImpl) response.getResult();  
        ArrayList<Object> values = (ArrayList<Object>)result.getValue(SESSION_OBJECTS);
    }else{
        logger.error("Error executing rules. Message: {}", response.getMsg());
    }

    logger.debug("...finished running rules.");

    return output;
}

The rules are correctly executed and the Output Object are instancied during the rules. One problem is when I again call this method to execute rules for the second time, I receive two Output object and for each subsequent calls I get one additional object. It seems that the objects in the session are stored and not getting cleared for each call. How can I achieve that for every call I will get only one Output object in return?

1

1 Answers

1
votes

Since you are new to Drools, you may not know that Drools has two session types, stateless and stateful. Verify the KIE Execution Server session configuration is stateless, as stateful keeps the facts from prior requests processing.

Verify it is stateless by its settings in the project editor:

Open Project Editor -> Knowledge bases and sessions

Review the existing one or create one with:

Add Knowledge Sessions -> and set the State to Stateless