Использование Drools с сервером Glassfish - PullRequest
1 голос
/ 13 марта 2011

Я пытаюсь использовать простое правило слюни с моим динамическим веб-приложением. Я создал свой сервлет и теперь пытаюсь интегрировать мое правило. Но это дает мне ошибку в этой строке

 RuleBase ruleBase = RuleBaseFactory.newRuleBase();

java.lang.NoSuchMethodError: org.drools.util.ChainedProperties.<init>(Ljava/lang/String;Ljava/lang/ClassLoader;Z)V
    at org.drools.RuleBaseConfiguration.init(RuleBaseConfiguration.java:395)
    at org.drools.RuleBaseConfiguration.<init>(RuleBaseConfiguration.java:251)
    at org.drools.common.AbstractRuleBase.<init>(AbstractRuleBase.java:147)
    at org.drools.reteoo.ReteooRuleBase.<init>(ReteooRuleBase.java:160)
    at org.drools.reteoo.ReteooRuleBase.<init>(ReteooRuleBase.java:137)
    at org.drools.RuleBaseFactory.newRuleBase(RuleBaseFactory.java:87)
    at org.drools.RuleBaseFactory.newRuleBase(RuleBaseFactory.java:75)
    at org.drools.RuleBaseFactory.newRuleBase(RuleBaseFactory.java:38)
    at server.HelloServlet.runRules(HelloServlet.java:148)
    at server.HelloServlet.NewRule(HelloServlet.java:181)
    at server.HelloServlet.doGet(HelloServlet.java:82)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)

А вот и мой класс Helloservlet.java

@ WebServlet ( "/ HelloServlet") открытый класс HelloServlet расширяет HttpServlet { приватный статический финал long serialVersionUID = 1L;

@EJB HelloBean bean;

@PersistenceUnit
EntityManagerFactory emf;




/**
 * @see HttpServlet#HttpServlet()
 */
public HelloServlet() {
    super();
    // TODO Auto-generated constructor stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out=response.getWriter();
    out.print("<html><body><title>servlet page</title>");
    out.print("<h1> " +request.getServletPath() + "</h1>");
    out.println("<h2>" + bean.sayHello("nabiyin") + "</h2>");
MyUser user=(MyUser)emf.createEntityManager().createQuery("select u from MyUser u").getResultList().get(0);

try {
NewRule();
} catch (Exception e) {
    // TODO Auto-generated catch block
    System.out.println("HATAAAAA");
    e.printStackTrace();
}




    out.print("age: " + user.getAge());

    if (user.getAge()<23) {
        out.println("hello");
    }

    out.print("</html></body>");
}

public void runRules(String[] rules, Object... facts)
throws Exception
{       
    RuleBase ruleBase = RuleBaseFactory.newRuleBase();
    PackageBuilder builder = new PackageBuilder();       

    for(String ruleFile : rules)
    {
        System.out.println("Loading file: "+ruleFile);
        builder.addPackageFromDrl(
                new InputStreamReader(
                    this.getClass().getResourceAsStream(ruleFile)));
    }

    Package pkg = builder.getPackage();       
    ruleBase.addPackage(pkg);

    WorkingMemory workingMemory
        = ruleBase.newStatefulSession();   

    for(Object fact : facts)
    {
        System.out.println("Inserting fact: "+fact);
        workingMemory.insert(fact);
    }

    workingMemory.fireAllRules();
}


public  void NewRule()
throws Exception
{
    System.out.println("New rule started");

   Number n1=3 , n2=1, n3=4 , n4=1 ,n5=5; 
   new HelloServlet().runRules(
          new String[]{"model/NewRule.drl"},
            n1,n2,n3,n4,n5);

    System.out.println("New rule finisheds");
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
}

1 Ответ

0 голосов
/ 20 марта 2012

Я рекомендую использовать механизм правил в качестве отдельного EJB-компонента в вашем веб-приложении, чтобы каждый веб-сеанс не создавал свой собственный экземпляр механизма правил (для простой демонстрации выше это не важно).

Можете ли вы попробовать поработатьс текущими библиотеками и попробуйте снова.(может быть, текущее слово не то, но есть разница!)
Посмотрите на примеры в текущем распределении слюней или этот простой пример: http://javadude.wordpress.com/2012/03/01/drools-expert-read-rules-from-string-and-database/

..
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.definition.KnowledgePackage;
..

(Эксперты могут исправить, если яошибаюсь)

...