Saturday, June 30, 2018

Spring Boot Application integrate with JBoss Drools

Halo sobat Nostra,
Postingan kali ini saya akan membahas tentang membuat aplikasi spring boot yang terintegrasi dengan JBoss Drools.

Drools merupakan Business Logic integration Platform (BLip) dimana cara kerja drools itu sendiri adalah memisahkan data dan logic
Didalam drools, session berfungsi untuk menyimpan semua fakta atau object. Kemudian fakta tersebut akan dicocokan terhadap semua rules yang ada


Gambar 1. Proses pembuatan knowledge session dalam drools
1. Proses pertama diawali dengan pembuatan object KnowledgeBuilder oleh KnowledgeBuilderFactory.
2. File yang berisikan rules (.drl) dibaca oleh KnowledgeBuilder.
3. Object KnowledgeBase membaca KnowledgePackage dari KnowledgeBuilder.
4. KnowledgeBase dapat digunakan untuk mebuat knowledge session.

Sekarang kita mulai ya . .
Untuk memulai project Spring boot, kita dapat clone project dari :
git clone https://github.com/spring-guides/gs-rest-service.git

Dalam file pom.xml tambahkan :
<dependency>   
 <groupId>org.kie</groupId>   
 <artifactId>kie-ci</artifactId>   
 <version></version>
</dependency>
- Create model class Java (Product.java)
package com.drools.model;
public class Product {

   private String type;   
   private int discount;
   public String getType() {
      return type;   }

   public void setType(String type) {
      this.type = type;   }

   public int getDiscount() {
      return discount;   }

   public void setDiscount(int discount) {
      this.discount = discount;   }

}
- Create .drl file (rules.drl). File ini berisi type dari product. Pada project ini, file .drl ini saya letakkan di src/main/resources/rules
package rules
 
import com.drools.model.Product
rule "Offer for Keripik"
   when 
      productObject: Product(type=="keripik")
   then
      productObject.setDiscount(20);
   end
rule "Offer for Roti"
   when 
      productObject: Product(type=="roti")
   then
      productObject.setDiscount(17);
   end
Project Drools 6.0 terdiri dari file meta data META-INF/kmodule.xml. File ini terletak di src/main/resources/META-INF . dengan file ini knowledge session akan terbentuk. 
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <kbase name="rules" packages="rules">
       <ksession name="rulesSession" />
    </kbase>
</kmodule>
Kemudian create file controller (CemilanController)
package com.drools.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.drools.model.Product;
import com.drools.service.CemilanService;

@RestController
public class CemilanController {

   private final CemilanService cemilanService;

   @Autowired
   public CemilanController(CemilanService cemilanService) {
      this.cemilanService = cemilanService;
   }

   @RequestMapping(value = "/getDiscount", method = RequestMethod.GET, 
                   produces = "application/json")
   public Product getQuestions(@RequestParam(required = true) String type) {

      Product product = new Product();
      product.setType(type);
      cemilanService.getProductDiscount(product);
      return product;   }

}
Kemudian create CemilanService untuk mendapatkan session dan execute rules
package com.drools.service;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.drools.model.Product;

@Service
public class CemilanService {

   private final KieContainer kieContainer;
   @Autowired   
   public CemilanService(KieContainer kieContainer) {
      this.kieContainer = kieContainer;   
   }

   public Product getProductDiscount(Product product) {
      KieSession kieSession = kieContainer.newKieSession("rulesSession");
      kieSession.insert(product);
      kieSession.fireAllRules();
      kieSession.dispose();
      return product;
   }
}
Dalam service di atas, kita membuat KieSession dengan menginstance KieContainer.
KieSession itu sendiri merupakan tempat dimana data yang di input di masukkan. Dimana KieSession berinteraksi dengan mesin untuk memproses logika bisnis berdasarkan data yang dimasukkan. Dalam code diatas, kita membuat variable kieSession "rulesSession" untuk menyimpan perhitungan produk.
Untuk memasukkan data product ke dalam session, maka perintahnya adalah kieSession.insert(product), kemudian kieSession akan meminta mesin untuk menjalankan logika bisnis dengan perintah fireAllRules(). Untuk menghindari memory penuh, maka perlu membersihkan session dengan dispose(). 


Dalam file Application.java, kita langsung memanggil service yang sudah kita code diatas dengan KieServices.Factory.get()
tambahkan code berikut:
@Beanpublic KieContainer kieContainer() {
   return KieServices.Factory.get().getKieClasspathContainer();
}

Testing
Untuk melihat hasilnya, dapat di akses dengan dan hasil
http://localhost:8080/getDiscount?type=roti
dan hasilnya akan menunjukan nilai diskon dari type yang kita input dalam url

dan sekian postingan saya kali ini, semoga postingan ini bermanfaat
Terima kasih

Salam,


No comments:

Post a Comment