2016-09-29 12 views
0

私は自分のプロジェクトにdrools 6.3.0を使用します。私は2つのカテゴリーで約3千のルールを持っています。 1500ルールのカテゴリ1、1500ルールのカテゴリ2と言う。 データが異なる20k注文があります。各注文には異なる属性のセットがあります。今、要求ごとにキースセッションを作成するのは時間がかかり、実際には遅いです。したがって、すべての注文と注文を実行するために同じキースセッションを使用する計画は、マルチスレッドを使用して処理されます。Drools - 複数のリクエストに対する同じKieSession

私の現在のアプローチは以下のとおりです。

KieBase kieBase = null; 
KieServices kieServices = KieServices.Factory.get(); 
KieRepository kieRepository = kieServices.getRepository(); 
     kieRepository.addKieModule(new KieModule() { 
      @Override 
      public ReleaseId getReleaseId() { 
       return kieRepository.getDefaultReleaseId(); 
      } 
     }); 

KieFileSystem kfs = kieServices.newKieFileSystem(); 

kfs.write(******); // Load 3k rules in a for loop 
KieBuilder kb = kieServices.newKieBuilder(kfs); 
      kb.buildAll(); 
KieContainer kContainer = kieServices.newKieContainer(kieRepository.getDefaultReleaseId()); 
kieBase = kContainer.getKieBase(); 

kContainer = kieServices.newKieContainer(kieRepository.getDefaultReleaseId()); 
      kieBase = kContainer.getKieBase(); 
KieSession kieSession = kieBase.newKieSession(); 

これは私がkiesessionを作成し、すべての注文執行のために、このkiesessionを使用したい方法です。

スレッドプールを使用して並行して注文を実行したいです。

これはです

//ここではカテゴリといくつかのIDに基づいています。 各ルールはIDとカテゴリを持ちます。それぞれのidとcateogoryには、評価されるべきルールのセットがあります。

流れは、等

1である)、IDごとに) 3を実行するIDを取得し、各注文についてentry = id+_category

4のような形式のエントリポイントをDB 2)から20K注文を受けます)注文属性データとfireRulesを挿入します。今

final EntryPoint entryPoint = ksession.getEntryPoint(entry); 
     if (entryPoint != null) { 
      entryPoint.insert(data); 
      ksession.fireAllRules(); 
     } else { 
      log.warn("No rules to be executed"); 
     } 

、iは並列に命令を実行しなければならないように、

parallalに以下のコードをコールする各順序、以来

entryPoint.insert(data); 
ksession.fireAllRules(); 

、異なる属性及び挿入を有することになる各注文エントリーポイントとは異なるデータ、それは問題を引き起こしており、期待される結果を得ていません。

これを達成するにはどうすればよいですか?

おかげ

答えて

0

ない超専門家が、私は似たように探していると私は答えは本当にすべてで並列実行ではありません同期ブロック...にこれらの呼び出しを取得したりするかと思いますStatelessKieSessionを代わりに使用してください。KieSessionは実行呼び出しに対してローカルで、独自の作業メモリを使用しているため、.execute(...)に渡すデータオブジェクトのみが存在します。

驚くべきことに、単一の通常セッションを再利用し、ルールを起動する間にオブジェクトをクリアするのと比較して、ステートレスセッションを使用するのにはかなり時間がかかりません。

関連する問題