2017-06-15 14 views
0

私はdroolsを初めて使っています。この質問は意見に基づいている可能性があります。私はStandalone Javaアプリケーションでdrools6.5を使用しましたが、Tomcat7(JDK8)の既存の/ webappsに追加したいと考えています。 webappsは、単純なjsp/servlet/htmlベース(主に手作業でコーディングされた、Springなし)です。Drools on Tomcat

Tomcat/webappsでDrools6.5を使用するのに役立つサンプルがありますか?私はそれが動作することを期待して、次の構造を作成しようとしました。 webapps/ WEB-INF/ |--classes/all_my_classes.class META-INF/ |--maven |---pom.properties |--kmodule.xml |--rules/myrule.drl

しかし、kSession.insert()が呼び出されたときにコードでNULLポインタ例外が生成されました。

DroolsPojoIn message = new DroolsPojoIn(); 
//## message setters. 
KieServices ks = KieServices.Factory.get(); 
KieContainer kContainer = ks.getKieClasspathContainer(); 
KieSession kSession = kContainer.newKieSession("ksession-rules"); 
kSession.insert(message); //Generated NullPointerException. 

このコードと構造は、スタンドアロンのアプリケーションでうまく機能します。

おかげ&敬具 ショーン

+0

この行からスタックダンプが開始された場合、kSessionはnullであり、そうでなければ "同じコード"は機能しませんでした。このオブジェクトをどのように作成しますか? – laune

+0

サンプルコードを追加しました。 kSessionは前の行で初期化されていますが、それでもNullPointerを生成します。 – Shawn

答えて

0

は、私が最初に私は(それが必要ではなかった)META-INFフォルダを削除、次のURL

Loading and updating rules from a database in Drools 6

で解決策を見つけました。それから私は主要な3つのクラス変数をどの関数の外にも宣言しました。私たちが環境設定ファイルより/ pathsを使って手動でdroolsファイルを読み込む方が簡単でした。

KieServices ks = null; 
KieContainer kContainer; 
KieSession kSession; 

は、それからサーブレットpublic void init()関数に次のコードを追加しました。

ks = KieServices.Factory.get();   
/* File System Handler */ 
KieFileSystem kfs = ks.newKieFileSystem(); 
kfs.write("/data/rules/lesson01.drl", "/data/rules/sample02.drl"); 
KieBuilder kieBuilder = ks.newKieBuilder(kfs).buildAll(); 
Results results = kieBuilder.getResults(); 
if(results.hasMessages(Message.Level.ERROR)){ 
    System.out.println(results.getMessages()); 
     throw new IllegalStateException("### errors ###"); 
    } 
kContainer = ks.newKieContainer(ks.getRepository().getDefaultReleaseId()); 
KieBase kieBase = kContainer.getKieBase(); 
kSession = kContainer.newKieSession(); 

public void doGet()に私はルールを実行しました。

DroolsPojo message = new DroolsPojo(); /*My Simple Pojo object*/ 
message.setMessage("Marketing Strategy"); 
message.setStatus(DroolsPojo.MARKET); 
kSession.insert(message); 
kSession.fireAllRules(); 

これが良い方法がある場合は、私にお知らせください。

+0

回答で質問しないでください。そして、これがなぜNPEを修正するのかは不明です。 – laune