簡體   English   中英

當我使用Eclipse Java應用程序運行時,相同的Drools執行文件的行為不同,並且沒有輸出

[英]same drools execution file behaving differently and gives no output when i run using eclipse java application

這是我的第一個Drools Java文件,用於執行DRL和規則流(工作正常)

package com.sample;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;

/**
 * This is a sample class to launch a rule.
 */
public class DroolsTest {

    public static final void main(String[] args) {
        try {
            // load up the knowledge base
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            // go !
            Message message = new Message();
            message.setMessage("Hello World");
            message.setStatus(Message.HELLO);
            ksession.insert(message);
            ksession.startProcess("test.new");
            ksession.fireAllRules();
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private static KnowledgeBase readKnowledgeBase() throws Exception {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("test1.drl"), ResourceType.DRL);
        kbuilder.add(ResourceFactory.newClassPathResource("test2.drl"), ResourceType.DRL);
        kbuilder.add(ResourceFactory.newClassPathResource("newruleflow.rf"), ResourceType.BPMN2);
        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();
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
        return kbase;
    }

    public static class Message {

        public static final int HELLO = 0;
        public static final int GOODBYE = 1;

        private String message;

        private int status;

        public String getMessage() {
            return this.message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

        public int getStatus() {
            return this.status;
        }

        public void setStatus(int status) {
            this.status = status;
        }

    }

}

這是相關的規則流文件(工作正常)

<?xml version="1.0" encoding="UTF-8"?> 
<process xmlns="http://drools.org/drools-5.0/process"
         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
         xs:schemaLocation="http://drools.org/drools-5.0/process drools-processes-5.0.xsd"
         type="RuleFlow" name="flow" id="test.new" package-name="com.sample">

  <header>
  </header>

  <nodes>
    <start id="1" name="Start" x="100" y="100" width="48" height="48" />
    <ruleSet id="2" name="Rule" x="273" y="110" width="139" height="26" ruleFlowGroup="t1" />
    <end id="4" name="End" x="117" y="200" width="27" height="20" />
    <ruleSet id="5" name="Rule" x="468" y="128" width="80" height="48" ruleFlowGroup="t2" />
  </nodes>

  <connections>
    <connection from="1" to="2" />
    <connection from="5" to="4" />
    <connection from="2" to="5" />
  </connections>

</process>

這是兩個DRL文件(工作正常)

package com.sample

import com.sample.DroolsTest.Message;

rule "Hello World"
ruleflow-group "t1"
    when
        m : Message( status == Message.HELLO, myMessage : message )
    then
        System.out.println( myMessage );
        m.setMessage( "Goodbye cruel world" );
        m.setStatus( Message.GOODBYE );
        System.out.println( "file1" );
        update( m );
end

rule "GoodBye"
ruleflow-group "t1"
    when
        Message( status == Message.GOODBYE, myMessage : message )
    then
        System.out.println( myMessage );
        System.out.println( "file1" );
end

-第2個DRL文件

package com.sample

import com.sample.DroolsTest.Message;

rule "Hello World2"
ruleflow-group "t2"
    when
        m : Message( status == Message.HELLO, myMessage : message )
    then
        System.out.println( myMessage );
        m.setMessage( "Goodbye cruel world" );
        m.setStatus( Message.GOODBYE );
        System.out.println( "file2" );
        update( m );
end

rule "GoodBye2"
ruleflow-group "t2"
    when
        Message( status == Message.GOODBYE, myMessage : message )
    then
        System.out.println( myMessage );
        System.out.println( "file2" );
end

-這是上述代碼集的輸出:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Hello World
file1
Goodbye cruel world
file1
Goodbye cruel world
file2

和日志: 在此處輸入圖片說明

現在的問題:我剛剛將DroolsTest.java復制到DroolsTest1.java,並將文件保存在同一文件夾中。 一切都一樣,但是當我將DroolsTest1.java文件作為Java應用程序執行時,我在控制台中看不到任何輸出。.我無法理解其背后的任何原因。 這是DroolsTest1.java

package com.sample;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;

import com.sample.DroolsTest.Message;

/**
 * This is a sample class to launch a rule.
 */
public class DroolsTest1 {

    public static final void main(String[] args) {
        try {
            // load up the knowledge base
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            // go !
            Message message = new Message();
            message.setMessage("Hello World");
            message.setStatus(Message.HELLO);
            ksession.insert(message);
            ksession.startProcess("test.new");
            ksession.fireAllRules();
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private static KnowledgeBase readKnowledgeBase() throws Exception {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("test1.drl"), ResourceType.DRL);
        kbuilder.add(ResourceFactory.newClassPathResource("test2.drl"), ResourceType.DRL);
        kbuilder.add(ResourceFactory.newClassPathResource("newruleflow.rf"), ResourceType.BPMN2);
        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();
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
        return kbase;
    }

    public static class Message {

        public static final int HELLO = 0;
        public static final int GOODBYE = 1;

        private String message;

        private int status;

        public String getMessage() {
            return this.message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

        public int getStatus() {
            return this.status;
        }

        public void setStatus(int status) {
            this.status = status;
        }

    }
}

這是上面文件的輸出:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

和日志: 在此處輸入圖片說明

可能是什么原因? 請幫忙。

我找到了答案:DroolsTest1.java導入不正確的import com.sample.DroolsTest.Message; 它應該是

import com.sample.DroolsTest1.Message; 

因此,沒有規則在開火,因此沒有答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM