Kogito is an advanced business automation toolkit that derives from the Open Source projects Drools and jBPM. Kogito aims at providing another approach to business automation where the main message is to expose your business knowledge the cloud and the larger Kubernetes ecosystem.
There are already several implementations for Kogito, today we will learn how to set up a Kogito project with Quarkus which uses Drools business rules.
Let’s start from a simple scenario. A Person requires credit access. The variables that will be checked are:
- The difference between the amount requested and the available credit
- The existence of an existing loan
package org.acme.kogito import org.acme.kogito.model.Person; rule "get credit" when $person: Person((credit > amount) && (!existingLoan)) then modify($person) { setApproved(true) }; end
Now let’s write a project for this simple use case.
Setting up the Quarkus Project:
Bootstrap a project which includes the default libraries (resteasy) and the kogito extension:
mvn io.quarkus:quarkus-maven-plugin:0.23.2:create \ -DprojectGroupId=org.acme \ -DprojectArtifactId=using-kogito \ -Dextensions="kogito"
Now let’s add the model class: Person.java
package org.acme.kogito.model; public class Person { private int amount; private int credit; private boolean existingLoan; private boolean approved; public int getAmount() { return amount; } public void setAmount(int amount) { this.amount = amount; } public int getCredit() { return credit; } public boolean isExistingLoan() { return existingLoan; } public boolean isApproved() { return approved; } public void setApproved(boolean approved) { this.approved = approved; } public void setCredit(int credit) { this.credit = credit; } public void setExistingLoan(boolean existingLoan) { this.existingLoan = existingLoan; } }
Then, a simple REST Endpoint which will capture requests for Credit and fire rules:
package org.acme.kogito.model; import org.kie.api.runtime.KieSession; import org.kie.kogito.rules.KieRuntimeBuilder; import javax.inject.Inject; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @Path("/credit") public class CreditResource { @Inject KieRuntimeBuilder runtimeBuilder; @POST @Produces(MediaType.TEXT_PLAIN) public Boolean getCredit(Person p) { KieSession ksession = runtimeBuilder.newKieSession(); ksession.insert(p); ksession.fireAllRules(); return p.isApproved(); } }
That’s all. Include a kmodule.xml file in resources/META-INF:
<kmodule xmlns="http://www.drools.org/xsd/kmodule" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
And include as well the Rule file into resources/org.acme.kogito. Here is the tree view of the Project:
We will finish by adding a Test class which will include two tests. The first one is going to pass, the second one will fail:
package org.acme.kogito; import static io.restassured.RestAssured.given; import static org.hamcrest.core.Is.is; import org.junit.jupiter.api.Test; import io.quarkus.test.junit.QuarkusTest; import io.restassured.http.ContentType; @QuarkusTest public class PersonProcessTest { @Test public void testPass() { given() .body("{\"amount\":200, \"credit\": 500, \"existingLoan\": \"false\"}") .contentType(ContentType.JSON) .when() .post("/credit") .then() .statusCode(200) .body(is("true")); } @Test public void testShouldFail() { given() .body("{\"amount\":200, \"credit\": 500, \"existingLoan\": \"true\"}") .contentType(ContentType.JSON) .when() .post("/credit") .then() .statusCode(200) .body(is("true")); } }
That’s all! Run the test with just:
$mvn clean install
Or try running your own tests:
$mvn quarkus:dev
$ curl -d '{"amount":200, "credit":500, "existingLoan":"false" }' -H "Content-Type: application/json" -X POST http://localhost:8080/credit
That’s all! Enjoy BPM with Kogito!