在之前的文章里,介绍了OMG的复杂DMN的例子.其中Recommended Loan Products.7z这个例子是最复杂,场景跟真实.其中有个很在意的点是居然可以调用java代码
这里第一行是创建一个函数, 名字叫string fromat, 函数两个参数.返回值是any
实际的处理是调用的 java的 String类,的public static方法. 具体可以
E:\Program Files\Java\jdk-11.0.15\bin> .\javap.exe -s java.lang.String
看到,每个函数的签名.
OMG给的解释是
The class-name SHALL be the string name of a Java class on the classpath. Classpath configuration is
implementation-defined. The method-signature SHALL be a string consisting of the name of a public static method in the
named class, followed by an argument list containing only Java argument type names. The argument type information
SHOULD be used to resolve overloaded methods and MAY be used to detect out-of-domain errors before runtime.
所有就有个想法,应该是可以调用自定义的类的.
如下是一个错误的尝试:
然后看wildfly的启动日志看jvm的加载lib
其中 sun.boot.class.path 里有C:\Program Files\Java\jdk1.8.0_131\jre\classes
然后把如下的代码编译成class放进去
package zzz;
public class Test{
public static void main(String[] s) {
System.out.println("1111111");
}
public static String t1() {
System.out.println("222");
return "222";
}
public static String t2(int c) {
System.out.println("333");
return "222"+c;
}
}
dmn调用处如下定义
确实可以编译通过,但发布的时候报错了.解决不了,放弃
如下是成功的尝试:
想起来drools里是项目都是maven的,maven可以添加依赖.那是不是自定义的代码作为一个maven项目被dmn项目依赖. dmn里就可以直接用自定义的类了呢?
创建一个maven项目 只包含上面的那个类 install到本地maven库.
因为drools也连着本地maven库, 点 add from 就会展示出所有项目 ,找到自己的
dmn不用改动. 点保存已经可以成功了. 点部署也成功了.
这时候问题来了.点部署会发布到kie-server里.用postman调用报错是classloader找不到这个类. 尝试各种方法解决(kie-server的maven库有没有自定义的jar,找maven安装在哪找不到,巴拉巴拉) 最后解决的方法很离谱
在部署页面,可以看到A区域是有报错的,指过去是报错的详细信息,就是classloader找不到类.
然后在B区域,把这个服务停止, 然后启动,启动花了大概5分钟,启动之后A区域就是对号了
结论就是给dmn项目添加依赖后kie-web里立刻生效,所以编辑发布都没问题. 但发布到kie-server后 kie-server并没有让依赖生效,所以k-s的报错是看到了函数调用找不到函数定义, 即可以认为是代码的修改生效了但依赖的添加没有生效. 重启服务后好了. 正常他应该自己重启服务的. 可以认为是drools自己的一个bug, 对于用户来说修复之前, 如果有依赖的改动,自己去重启下.
至此.实现了dmn内调用自定义的java代码, 已经有很大的价值了. 下一步如果自定义的java代码可以引用其他jar,那就可以实现更丰富的 甚至无限的功能了.
唯一需要注意一点是只能调用public static的方法(文档里是这么说的) 也就是没有了上下文. 必须上下文的清空可能需要持久化的操作来实现,比如数据库,或者文件.
ok 待后续更新