Я просматриваю Drools как возможность для применения правил. Я могу заставить Drools ссылаться на набор правил из файла .xls
и файла .drl
независимо друг от друга в данный момент времени. Однако в моем случае бывают случаи, когда правила не существуют в виде файла .xls
и будут запрограммированы в файле .drl
. Из-за этого мне интересно, если в рамках одного и того же выполнения программы, оба файла могут быть использованы в зависимости от определенных критериев ввода? Например, если State == "GA"
, тогда используйте .xls
, иначе, если
State == "FL"
затем используйте .drl
.
Я прочитал различные KieConcepts и понял их на высоком уровне, и я считаю, что мне придется создать каждый файл правил как отдельный KieContainer, а затем загрузить их в один KieBase на основе определений дано каждому здесь. Однако, когда дело доходит до этого шага, я запутываюсь относительно того, как это достигается. У меня уже есть два отдельных экземпляра, смогу ли я просто объединить эти два в одной программе, используя KieBase?
Реализация .xls
public static void main (String[] args) {
try {
KieServices ks = KieServices.Factory.get();
// add excel sheet to knowledge base
Resource dt = ResourceFactory.newClassPathResource("dtables/StateInterest.xls");
KieFileSystem kieFileSystem = ks.newKieFileSystem().write(dt);
KieBuilder kieBuilder = ks.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();
KieRepository kieRepository = ks.getRepository();
ReleaseId krDefaultReleaseID = kieRepository.getDefaultReleaseId();
KieContainer kieContainer = ks.newKieContainer(krDefaultReleaseID);
KieSession kSession = kieContainer.newKieSession();
// go !
StateInterestRequest stateInterestRequest = new StateInterestRequest();
stateInterestRequest.setPolicyIssueState("GA");
stateInterestRequest.setPolicyIssueDate("10/2018");
kSession.insert(stateInterestRequest);
kSession.fireAllRules();
Реализация .drl
public static final void main(String[] args) {
try {
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
// go !
StateInterestRequest stateInterestRequest = new StateInterestRequest();
stateInterestRequest.setPolicyIssueState("FL");
stateInterestRequest.setPolicyIssueDate("2008-03-04");
kSession.insert(stateInterestRequest);
kSession.fireAllRules();
В качестве дополнения, если возможно, это будет достигнуто через main()
окончательной объединенной программы или в рамках самих правил?