私は自分のプロジェクトに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();
、異なる属性及び挿入を有することになる各注文エントリーポイントとは異なるデータ、それは問題を引き起こしており、期待される結果を得ていません。
これを達成するにはどうすればよいですか?
おかげ