我正在尝试在OSGi应用程序中执行一个简单的HelloWorld规则。但是,在分析和编译期间,会发生以下异常:

java.lang.NullPointerException
at org.drools.rule.builder.RuleBuilder.build(RuleBuilder.java:47)
at org.drools.compiler.PackageBuilder.addRule(PackageBuilder.java:446)
at org.drools.compiler.PackageBuilder.addPackage(PackageBuilder.java:304)
at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:167)


应用程序可以找到DRL文件,因为引入语法错误会导致编译警告失败。我想我忽略了一些琐碎的事情,但还没有找到……

我正在使用Drools 4.0.7,因为该资源在Springsource Enterprise Bundle存储库中可用。这是我的应用程序代码和drl:

            //read in the source
        Reader source = new InputStreamReader( getClass().getResourceAsStream( "hello.drl" ) );

        PackageBuilder builder = new PackageBuilder();


        //this wil parse and compile in one step
        builder.addPackageFromDrl( source );

        // Check the builder for errors
        if ( builder.hasErrors() ) {
            System.out.println( builder.getErrors().toString() );
            throw new RuntimeException( "Unable to compile \"hello.drl\".");
        }

        //get the compiled package (which is serializable)
        org.drools.rule.Package pkg = builder.getPackage();

        //add the package to a rulebase (deploy the rule package).
        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
        ruleBase.addPackage( pkg );

        StatefulSession session = ruleBase.newStatefulSession();

        session.fireAllRules();


#created on: May 1, 2011


包装测试

规则“独立规则”

when
    eval(true)
then
    System.out.println("hello world");


结束

一如既往,我们非常感谢您的帮助。
KR,

尼尔斯

编辑:在调试过程中,我注意到PackageBuilder中的内部生成器对象为null,包和packagedescription也是如此。我通过手动添加以下描述来解决原始问题:

    PackageBuilder builder = new PackageBuilder();
        PackageDescr packageDescr = new PackageDescr("be.ugent.intec.doctr.processor.job.fever");
        builder.addPackage(packageDescr);

        //this will parse and compile in one step
        builder.addPackageFromDrl( source );


我的规则已编辑为以下形式:

package be.ugent.intec.doctr.processor.job.fever
rule "hello"
when
    eval( true )
then
    System.out.println("hello there");
end


但是,这会导致编译失败:

BR.recoverFromMismatchedToken
[1,0]: unknown:1:0 mismatched token: [@0,0:6='println',<7>,1:0];
java.lang.RuntimeException: Unable to compile "hello.drl".
at be.ugent.intec.doctr.processor.job.fever.FeverJob.execute(FeverJob.java:45)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525)


当从规则中删除打包行时,我的示例将一直执行,但是不打印任何内容。我又能俯瞰什么吗?考虑到一切都取决于包的声明,我认为这与drl本身的问题有关。为了清楚起见,drl加载在包be.ugent.intec.doctr.processor.job.fever中包含的类中。

谢谢!

最佳答案

NullPointerException不应在编译期间发生:解析时您会得到明确的编译错误(包括行号),否则它会起作用。 Drools 4.0.7是旧的。这可能已在较新版本的口水中修复。如果不是,请提出JIRA问题。

尝试使用最新版本的口水,最好是5.2版本(5.2.0.CR1将在今天或明天晚些时候发布),该版本将使用更好的新解析器。

10-05 18:54