2017-05-08 45 views
0

我是Kie Workbench和Execution Server的新手。我正在使用Java Rest調用來在kie工作臺中運行規則。請找到以下代碼:Drools - 檢索輸出對象

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; 
} 

規則在規則期間被正確執行並且輸出對象被立即執行。一個問題是當我再次調用這個方法來第二次執行規則時,我收到兩個Output對象,並且對於每個後續調用,我都會得到一個額外的對象。看來會話中的對象被存儲並且不會被每個調用清除。我怎樣才能達到這一點,每一個電話我只會得到一個輸出對象?

回答

1

由於您是Drools的新手,您可能不知道Drools有兩種會話類型,無狀態和有狀態。驗證KIE執行服務器會話配置是無狀態的,因爲有狀態保留事先請求處理的事實。

驗證它是無狀態由它在項目編輯器設置:

Open Project Editor -> Knowledge bases and sessions 

檢討現有的或創建一個具有:

Add Knowledge Sessions -> and set the State to Stateless 
+0

如何驗證KIE執行服務器會話配置是無狀態的? –

+0

我更新瞭如何驗證。完成後請接受答案。 – Jeff