gpt4 book ai didi

java - 流口水:DMN 1.2 FEEL 功能的评估不起作用

转载 作者:行者123 更新时间:2023-11-30 01:50:16 25 4
gpt4 key购买 nike

我想在 Drools 7.21 中评估 DMN 1.2 中新增的 FEEL 函数,例如 sqrt() 或 modulo(),但是该方法

dmnRuntime.evaluateAll(dmnModel,上下文)

始终返回值“null”(仅适用于新函数),状态为“SUCCESS”。我做错了什么或者缺少什么?

DMN 文件如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<semantic:definitions xmlns:semantic="http://www.omg.org/spec/DMN/20180521/MODEL/" xmlns="http://www.trisotech.com/definitions/_56fd6445-ff6a-4c28-8206-71fce7f80436" xmlns:feel="http://www.omg.org/spec/FEEL/20140401" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exporter="DMN Modeler" exporterVersion="6.0.1" id="_56fd6445-ff6a-4c28-8206-71fce7f80436" name="Sqrt-Function" namespace="http://www.trisotech.com/definitions/_56fd6445-ff6a-4c28-8206-71fce7f80436" >
<semantic:decision id="_cf6124bd-9907-4ac0-b4fd-59a962dbc502" name="square_root">
<semantic:variable id="_edaf978e-3634-4e52-8244-5fd4e16fd257" name="square_root" typeRef="feel:number"/>
<semantic:literalExpression id="_c990c3b2-e322-4ef9-931d-79bcdac99686">
<semantic:text>sqrt(81)</semantic:text>
</semantic:literalExpression>
</semantic:decision>
</semantic:definitions>

将文件导入“dmnModel”后:

DMNMarshaller marshaller = new org.kie.dmn.backend.marshalling.v1x.XStreamMarshaller();
FileInputStream fis = new FileInputStream( dmnFile );
Definitions unmarshal = marshaller.unmarshal( new InputStreamReader( fis ) );
DMNCompiler compiler = DMNFactory.newCompiler();
DMNModel dmnModel = compiler.compile(unmarshal);

我这样称呼 Drools 评估:

KieContainer kieContainer = KieHelper.getKieContainer(ks.newReleaseId("org.kie", "dmn-test-"+UUID.randomUUID(), "1.2"));
DMNRuntime dmnRuntime = kieContainer.newKieSession().getKieRuntime(DMNRuntime.class);
((DMNRuntimeImpl) dmnRuntime).setOption(new RuntimeTypeCheckOption(true));
DMNResult result = dmnRuntime.evaluateAll(dmnModel, context);

最佳答案

最好建议不要(取消)编码并且不必手动编译DMN文件;而是使用 KJAR 中 KieContainer 标准构建的标准方法; as detailed by the user guide in the documentation .

换句话说,这可以正确地处理您的 DMN 文件:

KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
DMNRuntime dmnRuntime = KieRuntimeFactory.of(kieContainer.getKieBase()).get(DMNRuntime.class);
DMNModel dmnModel = dmnRuntime.getModel(namespace, modelName);
DMNContext context = dmnRuntime.newContext();
((DMNRuntimeImpl) dmnRuntime).setOption(new RuntimeTypeCheckOption(true));
DMNResult result = dmnRuntime.evaluateAll(dmnModel, context);

生成9作为结果。

如果您确实想使用 KieHelper,最好将 DMN 文件作为 KieResource 传递给 KieHelper.getKieContainer(...) 的调用,例如: :

KieContainer kieContainer = KieHelper.getKieContainer(ks.newReleaseId("org.kie", "dmn-test-" + UUID.randomUUID(), "1.2"),
ks.getResources().newFileSystemResource(new File(dmnFile)));
DMNRuntime dmnRuntime = KieRuntimeFactory.of(kieContainer.getKieBase()).get(DMNRuntime.class);
((DMNRuntimeImpl) dmnRuntime).setOption(new RuntimeTypeCheckOption(true));
DMNModel dmnModel = dmnRuntime.getModel(namespace, modelName);
DMNContext context = dmnRuntime.newContext();
DMNResult result = dmnRuntime.evaluateAll(dmnModel, context);
System.out.println(result);

您可以根据您的用例,根据需要将调用 ks.getResources().newFileSystemResource(...) 更改为基于 URL、ClassPath、Byte、... 的资源。这样 KieHelper 将负责解码

另外,第二个代码段也适用于我的 DMN 文件,结果生成 9

代码中的问题是 DMNCompiler 的初始化实际上并不意味着由用户手动调用,实际上文档中没有任何地方需要手动管理它;上述两种方法都会将其委托(delegate)给 KieContainer/KieHelper 的内部,这将是标准方式。

我建议遵循文档中详细说明的 KieContainer 构建,如前一个示例中所示,但我希望这个答案可以帮助您解决任何问题 - 在本地都对我有用。

希望这有帮助!

关于java - 流口水:DMN 1.2 FEEL 功能的评估不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56328508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com