0

我是 Kie Workbench 的新手。我正在使用 Java Rest 调用来触发 kie 工作台中的规则。请在下面找到代码:

public class RuleEngineConnector {

    @Value("${brms.execution.server.url}")
    private String SERVER_URL;

    @Value("${brms.execution.server.username}")
    private String USER;


    @Value("${brms.execution.server.password}")
    private String PASSWORD;

    @Value("${brms.containerId}")
    private String CONTAINER_ID;

    private static final MarshallingFormat FORMAT = MarshallingFormat.JAXB;


    public String getAdapter(AdapterRuleDO adapterRule) {
        KieServicesConfiguration cfg = KieServicesFactory.newRestConfiguration(SERVER_URL, USER, PASSWORD);
        cfg.setMarshallingFormat(FORMAT);
        Set<Class<?>> extraClasses = new HashSet<Class<?>>();
        extraClasses.add(AdapterRuleDO.class);
        cfg.addJaxbClasses(extraClasses);
        KieServicesClient kieServicesClient = KieServicesFactory.newKieServicesClient(cfg);
        ServiceResponse<ExecutionResults> response = getRulesResponse(adapterRule, kieServicesClient);
        List<AdapterRuleDO> listOfObjects = (List<AdapterRuleDO>) response.getResult().getValue("get-adapter");//to be changed
        return listOfObjects.get(0).getAdapterName();
    }

    private ServiceResponse<ExecutionResults> getRulesResponse(AdapterRuleDO adapterRule, KieServicesClient kieServicesClient) {
        List<Command<?>> commands = new ArrayList<Command<?>>();
        KieCommands commandsFactory = KieServices.Factory.get().getCommands();
        commands.add(commandsFactory.newInsert(adapterRule, "adapterRule"));
        commands.add(commandsFactory.newFireAllRules());
        commands.add(commandsFactory.newGetObjects("get-adapter"));
        BatchExecutionCommand batchExecution = commandsFactory.newBatchExecution(commands);
        RuleServicesClient ruleServicesClient = kieServicesClient.getServicesClient(RuleServicesClient.class);
        ServiceResponse<ExecutionResults> response = ruleServicesClient.executeCommandsWithResults(CONTAINER_ID, batchExecution);
        return response;
    }

}

我正在正确触发规则,并且在触发规则后,AdapterRuleDO 类中的值会正确更新。一个问题是,当我再次调用此方法以第二次执行规则时,我收到两个 AdapterRuleDO 对象,并且对于每个后续调用,我都会获得一个额外的对象。似乎会话中的对象已存储,并且每次调用都不会被清除。我怎样才能为每次调用实现这一点,我只会得到一个 AdapterRuleDO 对象作为回报?

请注意,我只有一个这样的决策表,其中使用了这一事实。

4

3 回答 3

1

在搜索了不同的博客和用户论坛后,得到了一个运行良好的解决方案。上述问题可以通过以下步骤解决:

1)使用“adapterRule”而不是“get-adapter”来获取结果。

2) 在 KIE Workbench 中,搜索部署描述符并进行以下更改: <runtime-strategy>PER_REQUEST</runtime-strategy> 默认情况下,运行时策略为 SINGLETON。

希望这是有道理的,并帮助别人。

于 2016-10-04T10:23:06.253 回答
0

如果您对无状态评估感兴趣,请尝试将您的会话配置为无状态。这将为每个请求创建一个新会话。您应该能够在 kie-workbench 中执行此操作。

希望能帮助到你,

于 2016-09-29T08:53:45.067 回答
0

代替以下行:

 BatchExecutionCommand batchExecution = commandsFactory.newBatchExecution(commands);

使用这一行:

 BatchExecutionCommand batchExecution = commandsFactory.newBatchExecution(commands,Ksession_name);
于 2021-05-08T04:55:40.663 回答