Pengantar Drools

1. Ikhtisar

Drools adalah solusi Business Rule Management System (BRMS). Ini menyediakan mesin aturan yang memproses fakta dan menghasilkan keluaran sebagai hasil dari pemrosesan aturan dan fakta. Sentralisasi logika bisnis memungkinkan dilakukannya perubahan dengan cepat dan murah.

Ini juga menjembatani kesenjangan antara tim Bisnis dan Teknis dengan menyediakan fasilitas untuk menulis aturan dalam format yang mudah dipahami.

2. Ketergantungan Maven

Untuk memulai dengan Drools, pertama-tama kita perlu menambahkan beberapa dependensi di pom.xml kita :

 org.kie kie-ci 7.1.0.Beta1   org.drools drools-decisiontables 7.1.0.Beta1 

Versi terbaru dari kedua dependensi tersedia di Maven Central Repository sebagai kie-ci dan drools-decisiontables.

3. Dasar-dasar Drools

Kita akan melihat konsep dasar Drools:

  • Fakta - mewakili data yang berfungsi sebagai masukan untuk aturan
  • Working Memory - penyimpanan dengan Fakta, di mana mereka digunakan untuk pencocokan pola dan dapat dimodifikasi, disisipkan dan dihapus
  • Aturan - mewakili satu aturan yang mengaitkan Fakta dengan tindakan yang cocok. Ini dapat ditulis dalam Bahasa Aturan Drools di file .drl atau sebagai Tabel Keputusan di spreadsheet excel
  • Sesi Pengetahuan - memegang semua sumber daya yang diperlukan untuk aturan pengaktifan; semua Fakta dimasukkan ke dalam sesi, dan kemudian aturan yang cocok diaktifkan
  • Basis Pengetahuan - merepresentasikan pengetahuan dalam ekosistem Drools, memiliki informasi tentang sumber daya tempat Aturan ditemukan, dan juga membuat Sesi Pengetahuan
  • Module - Modul memiliki beberapa Basis Pengetahuan yang dapat menampung sesi berbeda

4. Konfigurasi Java

Untuk mengaktifkan aturan pada data tertentu, kita perlu memberi contoh framework yang disediakan kelas dengan informasi tentang lokasi file aturan dan Fakta:

4.1. KieFileSystem

Pertama, kita perlu menyetel kacang KieFileSystem ; ini adalah sistem file dalam memori yang disediakan oleh framework. Kode berikut menyediakan wadah untuk menentukan sumber daya Drools seperti file aturan, tabel keputusan, secara terprogram:

public KieFileSystem kieFileSystem() throws IOException { KieFileSystem kieFileSystem = getKieServices().newKieFileSystem(); for (Resource file : getRuleFiles()) { kieFileSystem.write( ResourceFactory.newClassPathResource( RULES_PATH + file.getFilename(), "UTF-8")); } return kieFileSystem; }

Di sini RULES_PATH menunjukkan lokasi file aturan pada sistem file. Di sini kita membaca file dari classpath yang biasanya / src / main / resource dalam kasus proyek Maven.

4.2. KieContainer

Selanjutnya, kita perlu mengatur KieContainer yang merupakan placeholder untuk semua KieBases untuk KieModule tertentu . KieContainer dibangun dengan bantuan kacang lain termasuk KieFileSystem, KieModule, dan KieBuilder.

Metode buildAll () yang dipanggil pada KieBuilder membangun semua sumber daya dan mengikatnya ke KieBase. Ini berhasil dijalankan hanya jika dapat menemukan dan memvalidasi semua file aturan:

public KieContainer kieContainer() throws IOException { KieRepository kieRepository = getKieServices().getRepository(); kieRepository.addKieModule(new KieModule() { public ReleaseId getReleaseId() { return kieRepository.getDefaultReleaseId(); } }); KieBuilder kieBuilder = getKieServices() .newKieBuilder(kieFileSystem()) .buildAll(); return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId()); }

4.3. KieSession

Aturan dipicu dengan membuka kacang KieSession - yang dapat diambil dari KieContainer:

public KieSession kieSession() throws IOException { return kieContainer().newKieSession(); }

5. Menerapkan Aturan

Sekarang setelah kita selesai dengan pengaturannya, mari kita lihat beberapa opsi untuk membuat aturan.

Kami akan mengeksplorasi penerapan aturan dengan contoh mengkategorikan pelamar untuk peran tertentu, berdasarkan gajinya saat ini dan jumlah tahun pengalaman yang dia miliki.

5.1. Berkas Aturan Drools ( .drl )

Sederhananya, file aturan Drools berisi semua aturan bisnis.

Aturan menyertakan konstruksi When-Then , di sini bagian When mencantumkan kondisi yang akan diperiksa, dan bagian Then mencantumkan tindakan yang harus diambil jika ketentuan tersebut terpenuhi:

package com.baeldung.drools.rules; import com.baeldung.drools.model.Applicant; global com.baeldung.drools.model.SuggestedRole suggestedRole; dialect "mvel" rule "Suggest Manager Role" when Applicant(experienceInYears > 10) Applicant(currentSalary > 1000000 && currentSalary <= 2500000) then suggestedRole.setRole("Manager"); end

Aturan ini dapat diterapkan dengan memasukkan fakta Pemohon dan Peran yang Disarankan di KieSession:

public SuggestedRole suggestARoleForApplicant( Applicant applicant,SuggestedRole suggestedRole){ KieSession kieSession = kieContainer.newKieSession(); kieSession.insert(applicant); kieSession.setGlobal("suggestedRole",suggestedRole); kieSession.fireAllRules(); // ... }

Ini menguji dua kondisi pada contoh Pengusul dan kemudian berdasarkan pada pemenuhan kedua kondisi itu menetapkan bidang Peran di objek Peran yang Disarankan .

Ini dapat diverifikasi dengan menjalankan tes:

@Test public void whenCriteriaMatching_ThenSuggestManagerRole(){ Applicant applicant = new Applicant("David", 37, 1600000.0,11); SuggestedRole suggestedRole = new SuggestedRole(); applicantService.suggestARoleForApplicant(applicant, suggestedRole); assertEquals("Manager", suggestedRole.getRole()); }

Dalam contoh ini, kami telah menggunakan beberapa kata kunci Drools yang disediakan. Mari kita pahami penggunaannya:

  • package - ini adalah nama paket yang kita tentukan di kmodule.xml, file aturan terletak di dalam paket ini
  • import - ini mirip denganpernyataan import Java, di sini kita perlu menentukan kelas yang kita sisipkan di KnowledgeSession
  • global - ini digunakan untuk mendefinisikan variabel tingkat global untuk sesi; ini dapat digunakan untuk melewatkan parameter masukan atau untuk mendapatkan parameter keluaran untuk meringkas informasi untuk sebuah sesi
  • dialek - dialek menentukan sintaksis yang digunakan dalam ekspresi di bagian kondisi atau bagian tindakan. Secara default dialeknya adalah Java. Drools juga mendukung mvel dialek; itu adalah bahasa ekspresi untuk aplikasi berbasis Java. Mendukung lapangan dan akses metode / pengambil
  • aturan - ini mendefinisikan blok aturan dengan nama aturan
  • ketika - ini menetapkan kondisi aturan, dalam contoh ini kondisi yang diperiksa adalah Pemohon yang memiliki pengalaman Selama bertahun-tahun lebih dari sepuluh tahun dan gaji saat ini dalam kisaran tertentu
  • then – this block executes the action when the conditions in the when block met. In this example, the Applicant role is set as Manager

5.2. Decision Tables

A decision table provides the capability of defining rules in a pre-formatted Excel spreadsheet. The advantage with Drools provided Decision Table is that they are easy to understand even for a non-technical person.

Also, it is useful when there are similar rules, but with different values, in this case, it is easier to add a new row on excel sheet in contrast to writing a new rule in .drl files. Let's see what the structure of a decision table with an example of applying the label on a product based on the product type:

The Decision Table is grouped in different sections the top one is like a header section where we specify the RuleSet (i.e. package where rule files are located), Import (Java classes to be imported) and Notes (comments about the purpose of rules).

The central section where we define rules is called RuleTable which groups the rules which are applied to the same domain object.

In the next row, we have column types CONDITION and ACTION. Within these columns, we can access the properties of the domain object mentioned in one row and their values in the subsequent rows.

The mechanism to fire the rules is similar to what we have seen with .drl files.

Kami dapat memverifikasi hasil dari penerapan aturan ini dengan menjalankan tes:

@Test public void whenProductTypeElectronic_ThenLabelBarcode() { Product product = new Product("Microwave", "Electronic"); product = productService.applyLabelToProduct(product); assertEquals("BarCode", product.getLabel()); }

6. Kesimpulan

Dalam artikel singkat ini, kami telah mempelajari penggunaan Drools sebagai mesin aturan bisnis dalam aplikasi kami. Kami juga telah melihat berbagai cara untuk menulis aturan dalam bahasa aturan Drools serta bahasa yang mudah dipahami di spreadsheet.

Seperti biasa, kode lengkap untuk artikel ini tersedia di GitHub.