Drools - Panduan Cepat

Aplikasi tingkat perusahaan Java apa pun dapat dibagi menjadi tiga bagian -

  • UI - Antarmuka Pengguna (Frontend)
  • Lapisan layanan yang pada gilirannya terhubung ke database
  • Lapisan bisnis

Kami memiliki sejumlah kerangka kerja yang menangani lapisan UI dan layanan bersama-sama, misalnya, Spring dan Struts. Namun, kami tidak memiliki cara standar untuk menangani logika bisnis sampai Drools muncul.

Apakah Drools itu?

Drools adalah a Business Logic integration Platform (BLiP). Itu ditulis di Jawa. Ini adalah proyek open source yang didukung oleh JBoss dan Red Hat, Inc. Ini memperluas dan menerapkan algoritma pencocokan Pola Rete.

Dalam istilah awam, Drools adalah kumpulan alat yang memungkinkan kita untuk memisahkan dan menalar logika dan data yang ditemukan dalam proses bisnis. Dua kata kunci penting yang perlu kita perhatikan adalahLogic dan Data.

Air liur dibagi menjadi dua bagian utama: Authoring dan Runtime.

  • Authoring - Proses pembuatan melibatkan pembuatan file Aturan (file .DRL).

  • Runtime - Ini melibatkan pembuatan memori kerja dan penanganan aktivasi.

Apa itu Mesin Aturan?

Drools adalah Mesin Aturan atau Sistem Aturan Produksi yang menggunakan pendekatan berbasis aturan untuk mengimplementasikan dan Sistem Pakar. Sistem Pakar adalah sistem berbasis pengetahuan yang menggunakan representasi pengetahuan untuk memproses pengetahuan yang diperoleh menjadi basis pengetahuan yang dapat digunakan untuk penalaran.

Sistem Aturan Produksi adalah Turing lengkap dengan fokus pada representasi pengetahuan untuk mengekspresikan logika proposisional dan orde pertama secara ringkas, tidak ambigu dan deklaratif.

Otak dari Sistem Aturan Produksi adalah sebuah Inference Engineyang dapat meningkatkan sejumlah besar aturan dan fakta. Mesin Inferensi mencocokkan fakta dan data dengan Aturan Produksi - juga disebutProductions atau hanya Rules - untuk menyimpulkan kesimpulan yang menghasilkan tindakan.

Aturan Produksi adalah struktur dua bagian yang menggunakan logika orde pertama untuk menalar representasi pengetahuan. Mesin aturan bisnis adalah sistem perangkat lunak yang menjalankan satu atau lebih aturan bisnis dalam lingkungan produksi runtime.

Mesin Aturan memungkinkan Anda menentukan "What to Do" dan tidak "How to do it. ”

Apa itu Aturan?

Aturan adalah bagian dari pengetahuan yang sering diungkapkan sebagai, " Ketika beberapa kondisi terjadi, maka lakukan beberapa tugas."

When
   <Condition is true>
Then
   <Take desired Action>

Bagian terpenting dari sebuah Aturan adalah miliknya whenbagian. Jikawhen bagian puas, itu then bagian dipicu.

rule  <rule_name>
   <attribute> <value>
      
   when
      <conditions>
      
   then
      <actions>
end

Pencocokan Pola

Proses mencocokkan fakta baru atau yang sudah ada dengan Aturan Produksi disebut Pencocokan Pola, yang dilakukan oleh Mesin Inferensi. Ada sejumlah algoritma yang digunakan untuk Pencocokan Pola termasuk -

  • Linear
  • Rete
  • Treat
  • Leaps

Drools Menerapkan dan memperluas Algoritma Rete. Implementasi Drools Rete disebut ReteOO, yang menunjukkan bahwa Drools memiliki implementasi algoritma Rete yang ditingkatkan dan dioptimalkan untuk sistem berorientasi objek.

Keuntungan dari Mesin Aturan

Pemrograman Deklaratif

Aturan membuatnya mudah untuk mengungkapkan solusi untuk masalah yang sulit dan mendapatkan solusinya juga diverifikasi. Tidak seperti kode, Aturan ditulis dalam bahasa yang tidak terlalu rumit; Analis Bisnis dapat dengan mudah membaca dan memverifikasi seperangkat aturan.

Pemisahan Logika dan Data

Data berada di Objek Domain dan logika bisnis berada di Aturan. Bergantung pada jenis proyek, pemisahan semacam ini bisa sangat menguntungkan.

Kecepatan dan Skalabilitas

Algoritma Rete OO di mana Drools ditulis sudah menjadi algoritma yang terbukti. Dengan bantuan Drools, aplikasi Anda menjadi sangat skalabel. Jika ada permintaan perubahan yang sering, seseorang dapat menambahkan aturan baru tanpa harus mengubah aturan yang ada.

Sentralisasi Pengetahuan

Dengan menggunakan Rules, Anda membuat repositori pengetahuan (basis pengetahuan) yang bisa dieksekusi. Ini adalah satu titik kebenaran untuk kebijakan bisnis. Idealnya, Aturan sangat mudah dibaca sehingga bisa juga berfungsi sebagai dokumentasi.

Integrasi Alat

Alat seperti Eclipse menyediakan cara untuk mengedit dan mengelola aturan dan mendapatkan umpan balik langsung, validasi, dan bantuan konten. Alat pengauditan dan debugging juga tersedia.

Berikut adalah prasyarat untuk menginstal Plugin Drools -

  • Java 1.5 (atau lebih tinggi) SE JDK
  • Eclipse 4.2 (atau versi apa pun) dan plugin Drools

Karena Drools adalah BRMS (Business Rule Management System) yang ditulis di Java, kami akan membahas cara menambahkan plugin yang diinginkan di bagian ini. Mempertimbangkan pengguna Java maksimum menggunakan Eclipse, mari kita lihat cara menambahkan plugin Drools 5.x.0 di Eclipse.

Langkah 1: Unduh Binari

Unduh binari dari tautan berikut -

https://download.jboss.org/drools/release/5.3.0.Final/

Setelah pengunduhan selesai, ekstrak file ke hard disk Anda.

Langkah 2: Instal Perangkat Lunak

Luncurkan Eclipse dan buka help → install software baru. Klik Tambah seperti yang ditunjukkan pada tangkapan layar berikut.

Setelah itu, klik Lokal seperti yang ditunjukkan di sini dan pilih "… / binaries / org.drools.updatesite".

Pilih Drools dan jBPM dan klik Next.

Sekali lagi klik Next. Setelah itu, terima persyaratan dan perjanjian lisensi dan klik Selesai.

Setelah mengklik Selesai, penginstalan perangkat lunak dimulai -

Setelah penginstalan berhasil, Anda akan mendapatkan kotak dialog berikut -

Klik ya. Setelah Eclipse dimulai ulang, buka Windows → Preferensi

Anda dapat melihat Drools di bawah preferensi Anda. Penginstalan plugin Drools Anda selesai sekarang.

Waktu proses Drools diperlukan untuk menginstruksikan editor untuk menjalankan program dengan versi jar Drools tertentu. Anda dapat menjalankan program / aplikasi Anda dengan Drools Runtime yang berbeda.

Klik pada Windows → Preferensi → Drools → Installed Drools Runtime. Kemudian klik Tambah seperti yang ditunjukkan pada tangkapan layar berikut.

Setelah itu, klik Create a new Drools Runtime seperti yang ditunjukkan di sini.

Masuk ke jalur hingga folder binari tempat Anda mengunduh droolsjbpm-tools-distribution-5.3.0.Final.zip

Klik OK dan berikan nama untuk Drools Runtime. Runtime Drools sekarang dibuat.

Untuk membuat program Drools dasar, buka Eclipse. Pergi ke Fileb → New → Project.

Pilih Proyek Drools. Berikan nama yang cocok untuk proyek tersebut. Misalnya, DroolsTest.

Layar berikutnya meminta Anda untuk memilih beberapa file yang Anda inginkan dalam proyek Drools pertama Anda.

Pilih dua file pertama. File pertama adalah file .drl (File Aturan Drools) dan file kedua adalah kelas Java untuk memuat dan menjalankan aturan HelloWorld.

Klik Berikutnya → Selesai.

Setelah Anda mengklik Selesai, proyek <DroolsTest> dibuat di ruang kerja Anda. Buka kelas Java lalu klik kanan dan jalankan sebagai aplikasi Java. Anda akan melihat hasilnya seperti yang ditunjukkan di sini -

Selanjutnya, kita akan membahas istilah-istilah yang sering digunakan dalam Rule Engine.

Aturan

Inti dari Mesin Aturan tempat Anda menentukan kondisi (jika 'a' lalu 'b').

Fakta

Fakta adalah data yang menjadi dasar aturan untuk ditindaklanjuti. Dari perspektif Jawa, Fakta adalah POJO (Objek Jawa Kuno).

Sidang

Sesi Pengetahuan di Drools adalah komponen inti untuk menjalankan aturan. Ini adalah sesi pengetahuan yang memegang semua aturan dan sumber daya lainnya. Sesi Pengetahuan dibuat dari KnowledgeBase.

Agar mesin aturan berfungsi, Fakta dimasukkan ke dalam sesi dan ketika suatu kondisi terpenuhi, aturan berikutnya akan diaktifkan. Sesi terdiri dari dua jenis -

  • Sesi Pengetahuan Tanpa Kewarganegaraan
  • Sesi Pengetahuan Negara

Jadwal acara

Itu konsep yang logis. Agendanya adalah tempat logis di mana aktivasi menunggu untuk diluncurkan.

Aktivasi

Aktivasi adalah thenbagian dari aturan. Aktivasi ditempatkan dalam agenda di mana aturan yang sesuai diberlakukan.

Jika Anda melihat aturan default yang tertulis di proyek Hello World (Sample.drl), ada banyak kata kunci yang digunakan yang akan kami jelaskan sekarang.

Sample.drl

  • Package- Setiap Aturan dimulai dengan nama paket. Paket bertindak sebagai namespace untuk Rules. Nama aturan dalam sebuah paket harus unik. Paket dalam Rules mirip dengan paket di Java.

  • Import statement- Fakta apa pun yang ingin Anda terapkan aturannya, fakta tersebut perlu diimpor. Misalnya, com.sample.DroolsTest.Message; pada contoh di atas.

  • Rule Definition- Ini terdiri dari Nama Aturan, kondisi, dan Konsekuensi. Kata kunci ngiler adalahrule, when, then, dan end. Dalam contoh di atas, nama aturannya adalah "Hello World" dan "GoodBye". Ituwhen bagian adalah kondisi baik dalam aturan maupun thenbagian adalah konsekuensinya. Dalam terminologi aturan, filewhen bagian juga disebut sebagai LHS (sisi kiri) dan then bagian sebagai RHS (sisi kanan) aturan.

Sekarang mari kita telusuri istilah yang digunakan dalam file Java yang digunakan untuk memuat Drools dan menjalankan aturan.

Dasar pengetahuan

Basis Pengetahuan adalah antarmuka yang mengelola kumpulan aturan, proses, dan tipe internal. Itu terkandung di dalam paketorg.drools.KnowledgeBase. Di Drools, ini biasanya disebut sebagaiknowledge definitions atau knowledge. Definisi pengetahuan dikelompokkan menjadiknowledge packages. Definisi pengetahuan dapat ditambahkan atau dihapus. Tujuan utama Basis Pengetahuan adalah untuk menyimpan dan menggunakannya kembali karena pembuatannya mahal. Basis Pengetahuan menyediakan metode untuk membuat sesi pengetahuan.

Sesi Pengetahuan

Sesi pengetahuan diambil dari basis pengetahuan. Ini adalah antarmuka utama untuk berinteraksi dengan Drools Engine. Sesi pengetahuan dapat terdiri dari dua jenis -

  • Sesi Pengetahuan Tanpa Kewarganegaraan

  • Sesi Pengetahuan Negara

Sesi Pengetahuan Tanpa Kewarganegaraan

Stateless Knowledge Session adalah sesi stateless yang membentuk kasus penggunaan paling sederhana, tidak menggunakan inferensi. Sesi stateless dapat disebut seperti fungsi, meneruskan beberapa data dan kemudian menerima beberapa hasil kembali. Contoh umum dari sesi tanpa kewarganegaraan meliputi -

  • Validation

    • Apakah orang ini memenuhi syarat untuk mendapatkan hipotek?

  • Calculation

    • Hitung premi hipotek.

  • Routing and Filtering

    • Filter pesan masuk, seperti email, ke dalam folder.

    • Mengirim pesan masuk ke suatu tujuan

Sesi Pengetahuan Negara

Sesi stateful berumur lebih lama dan memungkinkan perubahan berulang dari waktu ke waktu. Beberapa kasus penggunaan umum untuk sesi stateful meliputi -

  • Monitoring

    • Pemantauan dan analisis pasar saham untuk pembelian semi-otomatis.

  • Diagnostics

    • Penemuan kesalahan, diagnosa medis

  • Logistics

    • Pelacakan paket dan penyediaan pengiriman

Pembangun Pengetahuan

Antarmuka KnoledgeBuilder bertanggung jawab untuk membangun KnowledgePackage dari definisi pengetahuan (aturan, proses, jenis). Itu terkandung di dalam paketorg.drools.builder.KnowledgeBuilder. Definisi pengetahuan bisa dalam berbagai format. Jika ada masalah dengan pembuatan, KnowledgeBuilder akan melaporkan kesalahan melalui dua metode ini:hasErrors dan getError.

Diagram berikut menjelaskan prosesnya

Dalam contoh di atas, saat kita mengambil contoh sederhana dari sesi pengetahuan stateless, kita telah memasukkan fakta dalam sesi tersebut, dan kemudian metode fireAllRules () dipanggil dan Anda melihat hasilnya.

Dalam kasus sesi pengetahuan stateful, setelah aturan diaktifkan, objek sesi pengetahuan stateful harus memanggil metode tersebut dispose() untuk melepaskan sesi dan menghindari kebocoran memori.

Seperti yang Anda lihat, .drl (file aturan) memiliki sintaksnya sendiri, mari kita bahas beberapa bagian dari sintaks Aturan dalam bab ini.

Ketentuan dalam Aturan

Sebuah aturan dapat berisi banyak kondisi dan pola seperti -

  • Akun (saldo == 200)
  • Pelanggan (name == “Vivek”)

Kondisi di atas memeriksa apakah saldo Rekening 200 atau nama Nasabah adalah "Vivek".

Variabel dalam Aturan

Nama variabel di Drools dimulai dengan simbol Dollar ($).

  • $ account - Akun ()
  • $ account adalah variabel untuk kelas Account ()

Drools dapat bekerja dengan semua tipe Java asli dan bahkan Enum.

Komentar di Rules

Karakter khusus, # atau //, dapat digunakan untuk menandai komentar satu baris.

Untuk komentar banyak baris, gunakan format berikut:

/*
   Another line
   .........
   .........
*/

Variabel Global

Variabel global adalah variabel yang ditugaskan ke sesi. Mereka dapat digunakan untuk berbagai alasan sebagai berikut -

  • Untuk parameter masukan (misalnya, nilai konstan yang dapat disesuaikan dari sesi ke sesi).

  • Untuk parameter keluaran (misalnya, pelaporan — aturan dapat menulis beberapa pesan ke variabel laporan global).

  • Titik masuk untuk layanan seperti logging, yang dapat digunakan dalam aturan.

Fungsi dalam Aturan

Fungsi adalah fitur kenyamanan. Mereka dapat digunakan dalam kondisi dan konsekuensi. Fungsi mewakili alternatif dari kelas utilitas / pembantu. Sebagai contoh,

function double calculateSquare (double value) {
   return value * value;
}

Dialek

Dialek menentukan sintaks yang digunakan dalam ekspresi kode apa pun yang berada dalam kondisi atau konsekuensi. Ini mencakup nilai balik, evals, evals inline, predikat, ekspresi arti-penting, konsekuensi, dan sebagainya. Nilai defaultnya adalahJava. Drools saat ini mendukung satu dialek lagi yang disebutMVEL. Dialek default dapat ditentukan pada tingkat paket sebagai berikut -

package org.mycompany.somePackage
dialect "mvel"

MVEL Dialek

MVEL adalah bahasa ekspresi untuk aplikasi berbasis Java. Ini mendukung akses lapangan dan metode / pengambil. Ini didasarkan pada sintaks Java.

Salience

Salience adalah fitur yang sangat penting dari Rule Syntax. Salience digunakan oleh strategi resolusi konflik untuk memutuskan aturan mana yang akan diaktifkan terlebih dahulu. Secara default, ini adalah kriteria utama.

Kita bisa menggunakan arti-penting untuk menentukan urutan aturan pengaktifan. Salience memiliki satu atribut, yang mengambil ekspresi apa pun yang mengembalikan sejumlah tipe int (bilangan positif dan negatif valid). Semakin tinggi nilainya, semakin besar kemungkinan aturan akan diterapkan oleh strategi resolusi konflik.

salience ($account.balance * 5)

Nilai arti-penting default adalah 0. Kita harus mengingat hal ini saat menetapkan nilai arti-penting ke beberapa aturan saja.

Ada banyak fitur / parameter lain dalam Sintaks Aturan, tetapi kami hanya membahas yang penting di sini.

Kata Kunci Konsekuensi Aturan

Kata Kunci Konsekuensi Aturan adalah kata kunci yang digunakan dalam "then"Bagian dari aturan.

  • Modify - Atribut fakta dapat dimodifikasi di then bagian dari Aturan.

  • Insert - Berdasarkan beberapa kondisi, jika benar, seseorang dapat memasukkan fakta baru ke dalam sesi Mesin Aturan saat ini.

  • Retract - Jika kondisi tertentu benar dalam sebuah Aturan dan Anda tidak ingin melakukan hal lain atas fakta tersebut, Anda dapat menarik fakta tersebut dari Mesin Aturan.

Note- Ini dianggap praktik yang sangat buruk untuk memiliki logika kondisional (pernyataan if) dalam konsekuensi aturan. Seringkali, aturan baru harus dibuat.

Dalam bab ini, kami akan membuat proyek Drools untuk pernyataan masalah berikut -

Bergantung pada kota dan jenis produk (Kombinasi Kota dan Produk), cari tahu pajak daerah yang terkait dengan kota itu.

Kami akan memiliki dua file DRL untuk proyek Drools kami. Kedua file DRL akan menunjukkan dua kota yang sedang dipertimbangkan (Pune dan Nagpur) dan empat jenis produk (bahan makanan, obat-obatan, jam tangan, dan barang mewah).

  • Pajak obat-obatan di kedua kota tersebut dianggap nol.

  • Untuk bahan makanan, kami telah mengasumsikan pajak sebesar Rs 2 di Pune dan Rs 1 di Nagpur.

Kami telah menggunakan harga jual yang sama untuk menunjukkan keluaran yang berbeda. Perhatikan bahwa semua aturan dipecat dalam aplikasi.

Berikut adalah model untuk menampung setiap itemType -

package com.sample;
import java.math.BigDecimal;
public class ItemCity {
   public enum City {
      PUNE, NAGPUR
   }
   public enum Type {
      GROCERIES, MEDICINES, WATCHES, LUXURYGOODS
   }
   private City purchaseCity;
   private BigDecimal sellPrice;
   private Type typeofItem;
   private BigDecimal localTax;
   
   public City getPurchaseCity() {
      return purchaseCity;
   }
   public void setPurchaseCity(City purchaseCity) {
      this.purchaseCity = purchaseCity;
   }
   public BigDecimal getSellPrice() {
      return sellPrice;
   }
   public void setSellPrice(BigDecimal sellPrice) {
      this.sellPrice = sellPrice;
   }
   public Type getTypeofItem() {
      return typeofItem;
   }
   public void setTypeofItem(Type typeofItem) {
      this.typeofItem = typeofItem;
   }
   public BigDecimal getLocalTax() {
      return localTax;
   }
   public void setLocalTax(BigDecimal localTax) {
      this.localTax = localTax;
   }
}

File DRL

Seperti yang disarankan sebelumnya, kami telah menggunakan dua file DRL di sini: Pune.drl dan Nagpur.drl.

Pune.drl

Ini adalah file DRL yang menjalankan aturan untuk kota Pune.

// created on: Dec 24, 2014
package droolsexample

// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;

// declare any global variables here
dialect "java"
rule "Pune Medicine Item"
   when
      item : ItemCity (purchaseCity == ItemCity.City.PUNE,
         typeofItem == ItemCity.Type.MEDICINES)
   then
      BigDecimal tax = new BigDecimal(0.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
end

rule "Pune Groceries Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.PUNE,
         typeofItem == ItemCity.Type.GROCERIES)
   then
      BigDecimal tax = new BigDecimal(2.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
end

Nagpur.drl

Ini adalah file DRL yang menjalankan aturan untuk kota Nagpur.

// created on: Dec 26, 2014
package droolsexample

// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;

// declare any global variables here
dialect "java"
rule "Nagpur Medicine Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.NAGPUR, 
         typeofItem == ItemCity.Type.MEDICINES)
   then
      BigDecimal tax = new BigDecimal(0.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
end

rule "Nagpur Groceries Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.NAGPUR, 
         typeofItem == ItemCity.Type.GROCERIES)
   then
      BigDecimal tax = new BigDecimal(1.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
end

Kami telah menulis file DRL berdasarkan kota, karena ini memberi kami kemampuan untuk menambahkan sejumlah file aturan nanti jika kota baru ditambahkan.

Untuk mendemonstrasikan bahwa semua aturan dipicu dari file aturan kami, kami telah menggunakan dua jenis item (obat-obatan dan bahan makanan); dan obat-obatan bebas pajak dan bahan makanan dikenai pajak sesuai kota.

Kelas pengujian kami memuat file aturan, memasukkan fakta ke dalam sesi, dan menghasilkan output.

Droolstest.java

package com.sample;

import java.math.BigDecimal;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import com.sample.ItemCity.City;
import com.sample.ItemCity.Type;

/* 
   *This is a sample class to launch a rule. 
*/

public class DroolsTest {
   public static final void main(String[] args) {
      try {
         // load up the knowledge base
         KnowledgeBase kbase = readKnowledgeBase();
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
         
         ItemCity item1 = new ItemCity();
         item1.setPurchaseCity(City.PUNE);
         item1.setTypeofItem(Type.MEDICINES);
         item1.setSellPrice(new BigDecimal(10));
         ksession.insert(item1);
         
         ItemCity item2 = new ItemCity();
         item2.setPurchaseCity(City.PUNE);
         item2.setTypeofItem(Type.GROCERIES);
         item2.setSellPrice(new BigDecimal(10));
         ksession.insert(item2);
         
         ItemCity item3 = new ItemCity();
         item3.setPurchaseCity(City.NAGPUR);
         item3.setTypeofItem(Type.MEDICINES);
         item3.setSellPrice(new BigDecimal(10));
         ksession.insert(item3);
         
         ItemCity item4 = new ItemCity();
         item4.setPurchaseCity(City.NAGPUR);
         item4.setTypeofItem(Type.GROCERIES);
         item4.setSellPrice(new BigDecimal(10));         
         ksession.insert(item4);
         
         ksession.fireAllRules();
         
         System.out.println(item1.getPurchaseCity().toString() + " " 
            + item1.getLocalTax().intValue());
         
         System.out.println(item2.getPurchaseCity().toString() + " "
            + item2.getLocalTax().intValue());
         
         System.out.println(item3.getPurchaseCity().toString() + " "
            + item3.getLocalTax().intValue());
         
         System.out.println(item4.getPurchaseCity().toString() + " "
            + item4.getLocalTax().intValue());
                            
      } catch (Throwable t) {
         t.printStackTrace();
      }
   }
   private static KnowledgeBase readKnowledgeBase() throws Exception {
      KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
      kbuilder.add(ResourceFactory.newClassPathResource("Pune.drl"), ResourceType.DRL);
      kbuilder.add(ResourceFactory.newClassPathResource("Nagpur.drl"), ResourceType.DRL);
      KnowledgeBuilderErrors errors = kbuilder.getErrors();
      
      if (errors.size() > 0) {
         for (KnowledgeBuilderError error: errors) {
            System.err.println(error);
         }
         throw new IllegalArgumentException("Could not parse knowledge.");
      }
      KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
      kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
      return kbase;
   }
}

Jika Anda menjalankan program ini, hasilnya adalah sebagai berikut -

PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10

Untuk Pune dan Nagpur, jika itemnya adalah obat, pajak lokalnya nol; sedangkan bila barangnya adalah produk grosir, pajaknya sesuai kota. Aturan lainnya dapat ditambahkan di file DRL untuk produk lain. Ini hanyalah contoh program.

Panggil Fungsi Eksternal dari File DRL

Di sini kami akan menunjukkan cara memanggil fungsi statis dari file Java di dalam file DRL Anda.

Pertama-tama, buat kelas HelloCity.java dalam paket yang sama com.sample.

package com.sample;

public class HelloCity {
   public static void writeHello(String name) {
      System.out.println("HELLO " + name + "!!!!!!");
   }
}

Setelah itu, tambahkan pernyataan import di file DRL untuk memanggil metode writeHello dari file DRL. Di blok kode berikut, perubahan dalam berkas DRL Pune.drl disorot dengan warna kuning.

// created on: Dec 24, 2014
package droolsexample

// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;
 
import com.sample.HelloCity;

//declare any global variables here
dialect "java"

rule "Pune Medicine Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.PUNE, 
         typeofItem == ItemCity.Type.MEDICINES)
   then
      BigDecimal tax = new BigDecimal(0.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
      HelloCity.writeHello(item.getPurchaseCity().toString());
end

rule "Pune Groceries Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.PUNE, 
         typeofItem == ItemCity.Type.GROCERIES)
   then
      BigDecimal tax = new BigDecimal(2.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
end

Jalankan program lagi dan hasilnya akan seperti berikut -

HELLO PUNE!!!!!!
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10

Perbedaan sekarang dalam keluaran ditandai dengan warna kuning yang menunjukkan keluaran dari metode statis di kelas Java.

Keuntungan memanggil metode Java adalah kita dapat menulis fungsi utilitas / pembantu apa pun di Java dan memanggilnya dari file DRL.

Ada berbagai cara untuk men-debug proyek Drools. Di sini, kami akan menulis kelas Utilitas untuk memberi tahu Anda aturan mana yang dipicu atau diaktifkan.

Dengan pendekatan ini, Anda dapat memeriksa semua aturan yang dipicu dalam proyek Drools Anda. Inilah Kelas Utilitas kami

Utility.java

package com.sample;
import org.drools.spi.KnowledgeHelper;

public class Utility {
   public static void help(final KnowledgeHelper drools, final String message){
      System.out.println(message);
      System.out.println("\nrule triggered: " + drools.getRule().getName());
   }
   public static void helper(final KnowledgeHelper drools){
      System.out.println("\nrule triggered: " + drools.getRule().getName());
   }
}

Metode pertama help mencetak aturan yang dipicu bersama dengan beberapa informasi tambahan yang dapat Anda berikan sebagai String melalui file DRL.

Aturan kedua helper mencetak apakah aturan tertentu dipicu atau tidak.

Kami telah menambahkan salah satu metode Utilitas di setiap file DRL. Kami juga menambahkan fungsi impor di file DRL (Pune.drl). Dalamthenbagian dari aturan, kami telah menambahkan pemanggilan fungsi utilitas. Pune.drl yang dimodifikasi diberikan di bawah ini. Perubahan disorot dengan warna biru.

Modifikasi Pune.drl

//created on: Dec 24, 2014
package droolsexample

//list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;
import com.sample.HelloCity; 
import function com.sample.Utility.helper;

// declare any global variables here
dialect "java"
rule "Pune Medicine Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.PUNE, 
         typeofItem == ItemCity.Type.MEDICINES)
   
   then
      BigDecimal tax = new BigDecimal(0.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
      HelloCity.writeHello(item.getPurchaseCity().toString()); 
      helper(drools);
end

rule "Pune Groceries Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.PUNE, 
         typeofItem == ItemCity.Type.GROCERIES)
   then
      BigDecimal tax = new BigDecimal(2.0);
      item.setLocalTax(tax.multiply(item.getSellPrice())); 
      helper(drools);
end

Demikian pula, kami telah menambahkan fungsi utilitas lainnya di file DRL kedua (Nagpur.drl). Ini kode yang dimodifikasi -

Nagpur.drl yang dimodifikasi

// created on: Dec 26, 2014
package droolsexample

// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal; 
import function com.sample.Utility.help;

//declare any global variables here
dialect "java"

rule "Nagpur Medicine Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.NAGPUR, 
         typeofItem == ItemCity.Type.MEDICINES)
   
   then
      BigDecimal tax = new BigDecimal(0.0);
      item.setLocalTax(tax.multiply(item.getSellPrice())); 
      help(drools,"added info");
end

rule "Nagpur Groceries Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.NAGPUR, 
         typeofItem == ItemCity.Type.GROCERIES)
   then
      BigDecimal tax = new BigDecimal(1.0);
      item.setLocalTax(tax.multiply(item.getSellPrice())); 
      help(drools,"info");
end

Jalankan program lagi dan itu akan menghasilkan keluaran berikut -

info

rule triggered: Nagpur Groceries Item
added info

rule triggered: Nagpur Medicine Item

rule triggered: Pune Groceries Item
HELLO PUNE!!!!!!

rule triggered: Pune Medicine Item
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10

Kedua fungsi utilitas dipanggil dan menunjukkan apakah aturan tertentu dipanggil atau tidak. Dalam contoh di atas, semua aturan dipanggil, tetapi dalam aplikasi perusahaan, fungsi utilitas ini dapat sangat berguna untuk men-debug dan mencari tahu apakah aturan tertentu diaktifkan atau tidak.

Menggunakan Perspektif Debug di Eclipse

Anda dapat men-debug aturan selama eksekusi aplikasi Drools Anda. Anda dapat menambahkan breakpoint sebagai konsekuensi dari aturan Anda, dan setiap kali breakpoint tersebut ditemukan selama pelaksanaan aturan, eksekusi dihentikan sementara. Anda kemudian dapat memeriksa variabel yang diketahui pada saat itu seperti yang Anda lakukan di Aplikasi Java, dan menggunakan opsi debugging normal yang tersedia di Eclipse.

Untuk membuat titik putus di file DRL Anda, cukup klik dua kali di baris tempat Anda ingin membuat titik putus. Ingat, Anda hanya dapat membuat breakpoint di filethenbagian dari aturan. Sebuah breakpoint dapat dihapus dengan mengklik dua kali pada breakpoint di editor DRL.

Setelah menerapkan breakpoint, Anda perlu men-debug aplikasi Anda sebagai aplikasi Drools. Titik henti Drools (titik putus dalam file DRL) hanya akan berfungsi jika aplikasi Anda di-debug sebagai aplikasi Drools. Inilah cara Anda perlu melakukan hal yang sama -

Setelah Anda men-debug aplikasi Anda sebagai aplikasi Drools, Anda akan melihat kontrol pada file DRL seperti yang ditunjukkan pada tangkapan layar berikut -

Anda dapat melihat variabel dan nilai objek saat ini pada titik debug itu. Kontrol yang sama dari F6 untuk pindah ke baris berikutnya dan F8 untuk melompat ke titik debug berikutnya juga berlaku di sini. Dengan cara ini, Anda dapat men-debug aplikasi Drools Anda.

Note - Perspektif debug dalam aplikasi Drools hanya berfungsi jika dialeknya adalah MVEL hingga Drools 5.x.