java-如何在运行时使drools drl文件访问更新的jar
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-如何在运行时使drools drl文件访问更新的jar,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3784字,纯文字阅读大概需要6分钟。
内容图文
![java-如何在运行时使drools drl文件访问更新的jar](/upload/InfoBanner/zyjiaocheng/653/1d28317f86a84da998b856ce1b55bda7.jpg)
最近,我在一个流口水项目上工作,遇到一些问题,我需要一些帮助.
在我的项目中,我通过使用URLClassLoader在运行时访问jar.这是代码:
Object object=null;
Class myclass=null;
URL jarPath=null;
try{
jarPath=new File("lib/Billing.jar").toURI().toURL();
URLClassLoader loader = new URLClassLoader(new URL[] { jarPath },ClassLoader.getSystemClassLoader());
ruleclass = loader.loadClass("dynamicclasses.Billing");
object = ruleclass.newInstance();
}
catch (Exception e) {e.printStackTrace}
获得类实例后,我将设置值并将对象传递给我的drools类
new DroolsClass().fireRules(object);
drools类包含以下代码:
public class DroolsClass {
public void fireRules(Object object){
try {
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
ksession.insert(object);
ksession.fireAllRules();
logger.close();
} catch (Throwable t) {
t.printStackTrace();
}
}
private static KnowledgeBase readKnowledgeBase() throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newFileResource("./rulefiles/testing.drl"), ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
// ------ some code
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase;
}
接下来,我有一个drl文件testing.drl,它存在于文件Directoty中,并且访问相同的类dynamicclasses.Billing,它存在于Billing.jar中
这是drl文件的内容:
import dynamicclasses.Billing;
rule "rule 3"
salience 10
dialect "mvel"
no-loop true
when
m : Billing(bplan=="plan1")
then
System.out.println("You have opted for plan1");
end
我遇到的问题是在运行时更新jar(即Billing.jar)的drl文件(即testing.drl)时
无法访问更新的jar.
我正在尝试做以下事情.
1)我将在运行时创建jar并根据需要对其进行更新.
2)我将在运行时创建一个drl文件,该文件将导入jar中存在的类,即dynamicclasses.Billing
我可以使用URLClassLoader访问我的java类中更新的jar内容.但是一旦将对象传递给drools类,就会收到以下异常
Unable to resolve ObjectType 'Billing' : [Rule name='rule 3']
Error importing : 'dynamicclasses.Billing'
java.lang.IllegalArgumentException: Could not parse knowledge.
如果我重新启动我的应用程序,我将不会有任何异常,因为该罐子已经存在,但是该对象似乎没有传递给drl,因此我没有任何结果.
我对代码进行了以下更改:
URLClassLoader loader = new URLClassLoader(new URL[] { jarPath },this.getClass().getClassLoader());
在这里,我最初得到相同的异常.但是,在我重新启动应用程序后,它可以正常工作,并且该规则被解雇,我将得到结果.
但是再次,如果我更新jar,它将仅访问以前的内容.
因此很明显,drl文件无法初始访问jar,甚至无法在更新后访问.
有什么办法可以使它正常工作吗?
谢谢.
解决方法:
谢谢:)最后,我能够解决此问题.您不仅需要将自定义类加载器传递给KnowledgeBuilderConfiguration,而且还需要将其传递给KnowledgeBaseConfiguration,以使您的知识库也知道您的自定义类加载器.
private static KnowledgeBase readKnowledgeBase(ClassLoader loader) throws Exception {
KnowledgeBuilderConfiguration kBuilderConfiguration = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(null, loader);
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(kBuilderConfiguration);
KnowledgeBaseConfiguration kbaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(null, loader);
kbuilder.add(ResourceFactory.newFileResource("./rulefiles/testing.drl"), ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error: errors) {
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbaseConfig);
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase;
}
内容总结
以上是互联网集市为您收集整理的java-如何在运行时使drools drl文件访问更新的jar全部内容,希望文章能够帮你解决java-如何在运行时使drools drl文件访问更新的jar所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。