Dynamically Update Rules at Runtime. Drools + Spring-Boot
So currently I'm practicing on using Drools (7.13.0.Final) with Spring-boot(1.5.12.RELEASE). I have made a sample application in Spring-boot with the following classes
Model: TaxiFare.java
@Data
public class TaxiFare {
private double surge;
private double netFare;
private double baseFare;
private double distanceTraveled;
}
Service: TaxiFareService.java
@Service
public class TaxiFareService {
@Autowired
private KieContainer kieContainer;
public TaxiFare getTaxiFare(TaxiFare fare) {
KieSession kieSession = kieContainer.newKieSession("rulesSession");
kieSession.insert(fare);
kieSession.fireAllRules();
kieSession.dispose();
return fare;
}
}
RestController: TaxiFareController.java
@RestController
public class TaxiFareController {
@Autowired
private TaxiFareService taxiFareService;
@RequestMapping(value = "/getFare", method = RequestMethod.GET)
public String getQuestions(@RequestParam(required = true) double baseFare, @RequestParam(required = true) double surge, @RequestParam(required = true) double distanceTraveled) {
TaxiFare fare = new TaxiFare();
fare.setBaseFare(baseFare);
fare.setSurge(surge);
fare.setDistanceTraveled(distanceTraveled);
taxiFareService.getTaxiFare(fare);
return String.format("NET FARE IS: %s", fare.getNetFare());
}
}
Configuration:
@Bean
public KieContainer kieContainer2() {
return KieServices.Factory.get().getKieClasspathContainer();
}
With a defined rules of
package rules
import com.samsung.bixby.management.drools.model.TaxiFare
rule "No Surge"
when
$fareObject: TaxiFare(surge == 0.0);
then
$fareObject.setNetFare($fareObject.getBaseFare() * $fareObject.getDistanceTraveled());
end
rule "Has Surge"
when
$fareObject: TaxiFare(surge > 0.0);
then
$fareObject.setNetFare($fareObject.getSurge() * $fareObject.getBaseFare() * $fareObject.getDistanceTraveled());
end
I've built this sample application using various Drools + Spring integration tutorials I've found online. At present, the rule engine works fine as it is but what I am trying to do is I want to be able to reload the rules file dynamically during the application's runtime everytime a new rule is added or an existing rule is modified. The application is packaged as a WAR and deployed in a web server.
I've read multiple articles regarding the use of KieScanner
but none of the written tutorials about it makes sense, even the documentation itself. Following the sample code they provide,
KieScanner kieScanner = kieServices.newKieScanner(kieContainer);
Always causes the build to fail as somehow the newKieScanner cannot seem to create a kieScanner based on the kieContainer provided. Is there any other way on having a dynamic rules setup for Drools or a clarification on how to implement KieScanner correctly?
Thank you.
java spring spring-boot drools
add a comment |
So currently I'm practicing on using Drools (7.13.0.Final) with Spring-boot(1.5.12.RELEASE). I have made a sample application in Spring-boot with the following classes
Model: TaxiFare.java
@Data
public class TaxiFare {
private double surge;
private double netFare;
private double baseFare;
private double distanceTraveled;
}
Service: TaxiFareService.java
@Service
public class TaxiFareService {
@Autowired
private KieContainer kieContainer;
public TaxiFare getTaxiFare(TaxiFare fare) {
KieSession kieSession = kieContainer.newKieSession("rulesSession");
kieSession.insert(fare);
kieSession.fireAllRules();
kieSession.dispose();
return fare;
}
}
RestController: TaxiFareController.java
@RestController
public class TaxiFareController {
@Autowired
private TaxiFareService taxiFareService;
@RequestMapping(value = "/getFare", method = RequestMethod.GET)
public String getQuestions(@RequestParam(required = true) double baseFare, @RequestParam(required = true) double surge, @RequestParam(required = true) double distanceTraveled) {
TaxiFare fare = new TaxiFare();
fare.setBaseFare(baseFare);
fare.setSurge(surge);
fare.setDistanceTraveled(distanceTraveled);
taxiFareService.getTaxiFare(fare);
return String.format("NET FARE IS: %s", fare.getNetFare());
}
}
Configuration:
@Bean
public KieContainer kieContainer2() {
return KieServices.Factory.get().getKieClasspathContainer();
}
With a defined rules of
package rules
import com.samsung.bixby.management.drools.model.TaxiFare
rule "No Surge"
when
$fareObject: TaxiFare(surge == 0.0);
then
$fareObject.setNetFare($fareObject.getBaseFare() * $fareObject.getDistanceTraveled());
end
rule "Has Surge"
when
$fareObject: TaxiFare(surge > 0.0);
then
$fareObject.setNetFare($fareObject.getSurge() * $fareObject.getBaseFare() * $fareObject.getDistanceTraveled());
end
I've built this sample application using various Drools + Spring integration tutorials I've found online. At present, the rule engine works fine as it is but what I am trying to do is I want to be able to reload the rules file dynamically during the application's runtime everytime a new rule is added or an existing rule is modified. The application is packaged as a WAR and deployed in a web server.
I've read multiple articles regarding the use of KieScanner
but none of the written tutorials about it makes sense, even the documentation itself. Following the sample code they provide,
KieScanner kieScanner = kieServices.newKieScanner(kieContainer);
Always causes the build to fail as somehow the newKieScanner cannot seem to create a kieScanner based on the kieContainer provided. Is there any other way on having a dynamic rules setup for Drools or a clarification on how to implement KieScanner correctly?
Thank you.
java spring spring-boot drools
add a comment |
So currently I'm practicing on using Drools (7.13.0.Final) with Spring-boot(1.5.12.RELEASE). I have made a sample application in Spring-boot with the following classes
Model: TaxiFare.java
@Data
public class TaxiFare {
private double surge;
private double netFare;
private double baseFare;
private double distanceTraveled;
}
Service: TaxiFareService.java
@Service
public class TaxiFareService {
@Autowired
private KieContainer kieContainer;
public TaxiFare getTaxiFare(TaxiFare fare) {
KieSession kieSession = kieContainer.newKieSession("rulesSession");
kieSession.insert(fare);
kieSession.fireAllRules();
kieSession.dispose();
return fare;
}
}
RestController: TaxiFareController.java
@RestController
public class TaxiFareController {
@Autowired
private TaxiFareService taxiFareService;
@RequestMapping(value = "/getFare", method = RequestMethod.GET)
public String getQuestions(@RequestParam(required = true) double baseFare, @RequestParam(required = true) double surge, @RequestParam(required = true) double distanceTraveled) {
TaxiFare fare = new TaxiFare();
fare.setBaseFare(baseFare);
fare.setSurge(surge);
fare.setDistanceTraveled(distanceTraveled);
taxiFareService.getTaxiFare(fare);
return String.format("NET FARE IS: %s", fare.getNetFare());
}
}
Configuration:
@Bean
public KieContainer kieContainer2() {
return KieServices.Factory.get().getKieClasspathContainer();
}
With a defined rules of
package rules
import com.samsung.bixby.management.drools.model.TaxiFare
rule "No Surge"
when
$fareObject: TaxiFare(surge == 0.0);
then
$fareObject.setNetFare($fareObject.getBaseFare() * $fareObject.getDistanceTraveled());
end
rule "Has Surge"
when
$fareObject: TaxiFare(surge > 0.0);
then
$fareObject.setNetFare($fareObject.getSurge() * $fareObject.getBaseFare() * $fareObject.getDistanceTraveled());
end
I've built this sample application using various Drools + Spring integration tutorials I've found online. At present, the rule engine works fine as it is but what I am trying to do is I want to be able to reload the rules file dynamically during the application's runtime everytime a new rule is added or an existing rule is modified. The application is packaged as a WAR and deployed in a web server.
I've read multiple articles regarding the use of KieScanner
but none of the written tutorials about it makes sense, even the documentation itself. Following the sample code they provide,
KieScanner kieScanner = kieServices.newKieScanner(kieContainer);
Always causes the build to fail as somehow the newKieScanner cannot seem to create a kieScanner based on the kieContainer provided. Is there any other way on having a dynamic rules setup for Drools or a clarification on how to implement KieScanner correctly?
Thank you.
java spring spring-boot drools
So currently I'm practicing on using Drools (7.13.0.Final) with Spring-boot(1.5.12.RELEASE). I have made a sample application in Spring-boot with the following classes
Model: TaxiFare.java
@Data
public class TaxiFare {
private double surge;
private double netFare;
private double baseFare;
private double distanceTraveled;
}
Service: TaxiFareService.java
@Service
public class TaxiFareService {
@Autowired
private KieContainer kieContainer;
public TaxiFare getTaxiFare(TaxiFare fare) {
KieSession kieSession = kieContainer.newKieSession("rulesSession");
kieSession.insert(fare);
kieSession.fireAllRules();
kieSession.dispose();
return fare;
}
}
RestController: TaxiFareController.java
@RestController
public class TaxiFareController {
@Autowired
private TaxiFareService taxiFareService;
@RequestMapping(value = "/getFare", method = RequestMethod.GET)
public String getQuestions(@RequestParam(required = true) double baseFare, @RequestParam(required = true) double surge, @RequestParam(required = true) double distanceTraveled) {
TaxiFare fare = new TaxiFare();
fare.setBaseFare(baseFare);
fare.setSurge(surge);
fare.setDistanceTraveled(distanceTraveled);
taxiFareService.getTaxiFare(fare);
return String.format("NET FARE IS: %s", fare.getNetFare());
}
}
Configuration:
@Bean
public KieContainer kieContainer2() {
return KieServices.Factory.get().getKieClasspathContainer();
}
With a defined rules of
package rules
import com.samsung.bixby.management.drools.model.TaxiFare
rule "No Surge"
when
$fareObject: TaxiFare(surge == 0.0);
then
$fareObject.setNetFare($fareObject.getBaseFare() * $fareObject.getDistanceTraveled());
end
rule "Has Surge"
when
$fareObject: TaxiFare(surge > 0.0);
then
$fareObject.setNetFare($fareObject.getSurge() * $fareObject.getBaseFare() * $fareObject.getDistanceTraveled());
end
I've built this sample application using various Drools + Spring integration tutorials I've found online. At present, the rule engine works fine as it is but what I am trying to do is I want to be able to reload the rules file dynamically during the application's runtime everytime a new rule is added or an existing rule is modified. The application is packaged as a WAR and deployed in a web server.
I've read multiple articles regarding the use of KieScanner
but none of the written tutorials about it makes sense, even the documentation itself. Following the sample code they provide,
KieScanner kieScanner = kieServices.newKieScanner(kieContainer);
Always causes the build to fail as somehow the newKieScanner cannot seem to create a kieScanner based on the kieContainer provided. Is there any other way on having a dynamic rules setup for Drools or a clarification on how to implement KieScanner correctly?
Thank you.
java spring spring-boot drools
java spring spring-boot drools
asked Nov 13 '18 at 8:50
ReiSchneiderReiSchneider
185
185
add a comment |
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53277079%2fdynamically-update-rules-at-runtime-drools-spring-boot%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53277079%2fdynamically-update-rules-at-runtime-drools-spring-boot%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown