Hello,

why does such a rule always loop? Even if no-loop is used?

rule "Hello World"
        no-loop
        when
                $fact1 : MyFactBean1(  )
                $fact2 : MyFactBean2(  ) from $fact1
        then
                System.out.println("Fired!!!");
                update($fact1);
end

The full code of my test application and drl is attached.

Best regards,
--
Przemysław Różycki
AMG.net, A Bull Group Company
ul. Łąkowa 29
90-554 Łódź
www.amg.net.pl

package com.sample;

import java.io.InputStreamReader;
import java.io.Reader;

import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.StatefulSession;
import org.drools.compiler.DroolsError;
import org.drools.compiler.PackageBuilder;
import org.drools.compiler.PackageBuilderErrors;
import org.drools.rule.Package;
import org.drools.rule.Rule;

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

	public static final void main(String[] args) {
		PackageBuilder packageBuilder = new PackageBuilder();
		Reader packageReader = 
			new InputStreamReader(
					Thread.currentThread().getContextClassLoader().getResourceAsStream(
							"Sample.drl"));
		try {
			packageBuilder.addPackageFromDrl(packageReader);
			PackageBuilderErrors errors = packageBuilder.getErrors();
			if (errors.getErrors().length != 0) {
				System.out.println("Package common.validateRequest has errors\n" + errors);
				for (DroolsError error : errors.getErrors()) {
					String errorMessage = error.getMessage() + " at lines";
					for (int line : error.getErrorLines()) {
						errorMessage += " " + line;
					}
					System.out.println(errorMessage);
				}
			}
			Package pkg = packageBuilder.getPackage();
			
			Rule[] rules = pkg.getRules();
			
			RuleBase ruleBase  = RuleBaseFactory.newRuleBase();
			ruleBase.addPackage(pkg);
			
			StatefulSession session = ruleBase.newStatefulSession();

			MyFactBean1 myFactBean1 = new MyFactBean1();
			MyFactBean2 myFactBean2 = new MyFactBean2();
			myFactBean2.setMessage("yeah");
			myFactBean1.setMyFactBean2(myFactBean2);
			
			session.insert(myFactBean1);
			
			session.fireAllRules();
			
			session.dispose();
		} catch (Exception e) {
			e.printStackTrace();
			System.exit(1);
		}
	}
	
	public static class MyFactBean1 {
		private MyFactBean2 myFactBean2;

		public void setMyFactBean2(MyFactBean2 myFactBean2) {
			this.myFactBean2 = myFactBean2;
		}

		public MyFactBean2 getMyFactBean2() {
			return myFactBean2;
		}
	}

	public static class MyFactBean2 {
		private String message;

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

		public String getMessage() {
			return message;
		}
		
	}
}
package com.sample

import com.sample.DroolsTest.MyFactBean1;
import com.sample.DroolsTest.MyFactBean2; 

rule "Hello World"
        no-loop
        when
                $fact1 : MyFactBean1(  )
                $fact2 : MyFactBean2(  ) from $fact1
        then
                System.out.println("Fired!!!");
                update($fact1); 
end
_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to