如何使用 spring 启动来触发部署在 KIE 服务器上的 DRL 规则?

How to fire DRL rules deployed on KIE Server using spring boot?

我在 Drools 工作台中创建了一个简单的项目。该项目有 1 个数据对象和 2 个 DRL 文件。我构建项目并将其部署到 KIE 服务器。我创建了一个简单的 spring 引导应用程序,它使用休息服务将数据加载到数据对象中并触发规则。下面是代码:

public class Main {

    private static String containerId = "ImportProducts_1.0.1-LATEST";
    private static String user = "kieserver";
    private static String password = "kieserver1!";
    private static String url = "http://localhost:8180/kieserver/services/rest/server";


    private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
    private static final MarshallingFormat FORMAT = MarshallingFormat.JSON;
    private static String CLASS_NAME = "ImportProduct";

    public static void main(String[] args) {
        List<ImportProduct> prods = new ArrayList<>();
        prods.add(new ImportProduct("1", "Grocery - Milk", "OK", 25.0));
        prods.add(new ImportProduct("2", "Fashion - Trouser", "NOT_OK", 1300.0));
        prods.add(new ImportProduct("3", "Grocery - Wheat", "OK", 425.0));
        prods.add(new ImportProduct("4", "Grocery - Dairy Milk Chocolate", "OK", 100.0));

        KieServicesConfiguration config = KieServicesFactory.newRestConfiguration(url, user, password, 60000);
        config.setMarshallingFormat(MarshallingFormat.JSON);
        RuleServicesClient client = KieServicesFactory.newKieServicesClient(config).getServicesClient(RuleServicesClient.class);

        List<Command<?>> cmds = new ArrayList<>();
        KieCommands commands = KieServices.Factory.get().getCommands();
        cmds.add(commands.newInsert(prods, CLASS_NAME));
        cmds.add(commands.newFireAllRules());

        BatchExecutionCommand myCommands = CommandFactory.newBatchExecution(cmds);
        ServiceResponse<ExecutionResults> response = client.executeCommandsWithResults(containerId, myCommands);

        if (response.getType() == ServiceResponse.ResponseType.SUCCESS) {
            LOGGER.info("Commands executed with success! Response: ");
            LOGGER.info("{}", response.getResult());
            List<ImportProduct> prodUpdated = (List<ImportProduct>) response.getResult().getValue(CLASS_NAME);
            //sale.setDiscount(saleUpdated.getDiscount());
            LOGGER.info("Response is: {}", response.getMsg());
            LOGGER.info("Output is: {}", prodUpdated.toString());
        } else {
            LOGGER.error("Error executing rules. Message: {}", response.getMsg());
        }

        //KieServices kieServices = KieServices.Factory.get();
        //ReleaseId releaseId = (ReleaseId) kieServices.newReleaseId( "com.test", "ImportProducts", "1.0.1-LATEST" );

    }
}

应用程序运行没有错误,但规则对 KIE 容器中提供的数据没有影响。如果状态 != 'OK',规则将删除数据对象。我正在取回我在 POST 请求服务的请求正文中发送的所有数据。我认为 DRL 功能已启用,如下面的堆栈跟踪所示:

22:11:40.139 [main] DEBUG org.kie.server.client.impl.AbstractKieServicesClientImpl - 即将反序列化内容:

 '{
  "type" : "SUCCESS",
  "msg" : "Kie Server info",
  "result" : {
    "kie-server-info" : {
      "id" : "kie-server-a017ffcb29dc",
      "version" : "7.55.0.Final",
      "name" : "kie-server-a017ffcb29dc",
      "location" : "http://172.17.0.3:8080/kie-server/services/rest/server",
      **"capabilities" : [ "KieServer", "BRM", "BPM", "CaseMgmt", "BPM-UI", "BRP", "DMN", "Swagger" ],**
      "messages" : [ {
        "severity" : "INFO",
        "timestamp" : {
  "java.util.Date" : 1623926563857
},
        "content" : [ "Server KieServerInfo{serverId='kie-server-a017ffcb29dc', version='7.55.0.Final', name='kie-server-a017ffcb29dc', location='http://172.17.0.3:8080/kie-server/services/rest/server', capabilities=[KieServer, BRM, BPM, CaseMgmt, BPM-UI, BRP, DMN, Swagger]', messages=null', mode=DEVELOPMENT}started successfully at Thu Jun 17 10:42:43 UTC 2021" ]
      } ],
      "mode" : "DEVELOPMENT"
    }
  }
}'

以下是我收到的回复:

22:11:41.515 [main] DEBUG org.kie.server.client.impl.AbstractKieServicesClientImpl - 即将反序列化内容:

 '{
  "type" : "SUCCESS",
  "msg" : "Container ImportProducts_1.0.1-LATEST successfully called.",
  "result" : {
    "execution-results" : {
      "results" : [ {
        "value" : [{"com.test.importproducts.ImportProduct":{
  "id" : "1",
  "category" : "Grocery - Milk",
  "status" : "OK",
  "price" : 25.0
}},{"com.test.importproducts.ImportProduct":{
  "id" : "2",
  "category" : "Fashion - Trouser",
  "status" : "NOT_OK",
  "price" : 1300.0
}},{"com.test.importproducts.ImportProduct":{
  "id" : "3",
  "category" : "Grocery - Wheat",
  "status" : "OK",
  "price" : 425.0
}},{"com.test.importproducts.ImportProduct":{
  "id" : "4",
  "category" : "Grocery - Dairy Milk Chocolate",
  "status" : "OK",
  "price" : 100.0
}}],
        "key" : "ImportProduct"
      } ],
      "facts" : [ {
        "value" : {"org.drools.core.common.DefaultFactHandle":{
  "external-form" : "0:3:459769708:-992461270:3:DEFAULT:NON_TRAIT:java.util.ArrayList"
}},
        "key" : "ImportProduct"
      } ]
    }
  }
}' 

请帮忙。

我解决了这个问题。以下是工作代码:

private Command<?> prepareCommands(List<ImportProduct> facts, String sessionName, String outIdentifier) {
    KieCommands commandsFactory = KieServices.Factory.get().getCommands();
    List<Command> commands = facts.stream().map(commandsFactory::newInsert).collect(Collectors.toList());
    commands.add(commandsFactory.newFireAllRules());
    ObjectFilter factsFilter = new ClassObjectFilter(ImportProduct.class);
    //System.out.println("Check1: "+commandsFactory.newGetObjects(factsFilter, CLASS_NAME));
    //System.out.println("Check2: "+commands.toString());
    commands.add(commandsFactory.newGetObjects(factsFilter, CLASS_NAME));
    return commandsFactory.newBatchExecution(commands, sessionName);
}