1. Gambaran keseluruhan
Drools adalah penyelesaian Sistem Pengurusan Peraturan Perniagaan (BRMS). Ia menyediakan enjin peraturan yang memproses fakta dan menghasilkan output sebagai hasil pemprosesan peraturan dan fakta. Pemusatan logik perniagaan memungkinkan untuk memperkenalkan perubahan dengan cepat dan murah.
Ini juga merapatkan jurang antara pasukan Perniagaan dan Teknikal dengan menyediakan kemudahan untuk menulis peraturan dalam format yang mudah difahami.
2. Pergantungan Maven
Untuk memulakan Drools, kita perlu menambahkan beberapa pergantungan terlebih dahulu di pom.xml kami :
org.kie kie-ci 7.1.0.Beta1 org.drools drools-decisiontables 7.1.0.Beta1
Versi terbaru dari kedua-dua pergantungan itu terdapat di Maven Central Repository sebagai kie-ci dan drools-tabletables
3. Asas Drools
Kami akan melihat konsep asas Drools:
- Fakta - mewakili data yang berfungsi sebagai input untuk peraturan
- Memori Kerja - penyimpanan dengan Fakta, di mana ia digunakan untuk pemadanan corak dan dapat diubah suai, dimasukkan dan dikeluarkan
- Peraturan - mewakili satu peraturan yang mengaitkan Fakta dengan tindakan yang sepadan. Ia dapat ditulis dalam Bahasa Peraturan Drools dalamfail .drl atau sebagai Jadual Keputusan dalam spreadsheet excel
- Sesi Pengetahuan - ia menyimpan semua sumber yang diperlukan untuk peraturan pemecatan; semua Fakta dimasukkan ke dalam sesi, dan kemudian peraturan yang sesuai dipecahkan
- Pangkalan Pengetahuan - mewakili pengetahuan dalam ekosistem Drools, ia mempunyai maklumat mengenai sumber di mana Peraturan dijumpai, dan juga mewujudkan Sesi Pengetahuan
- Modul - Modul mempunyai beberapa Pangkalan Pengetahuan yang dapat mengadakan sesi yang berbeza
4. Konfigurasi Java
Untuk mengaktifkan peraturan pada data tertentu, kita perlu membuat kerangka yang disediakan kelas dengan maklumat mengenai lokasi fail peraturan dan Fakta:
4.1. Sistem KieFile
Pertama, kita perlu menetapkan kacang KieFileSystem ; ini adalah sistem fail dalam memori yang disediakan oleh rangka kerja. Kod berikut menyediakan wadah untuk menentukan sumber Drools seperti fail peraturan, jadual keputusan, secara program:
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 fail peraturan pada sistem fail. Di sini kita membaca fail dari classpath yang biasanya / src / main / resource sekiranya berlaku projek Maven.
4.2. KieContainer
Seterusnya, kita perlu menetapkan KieContainer yang merupakan placeholder untuk semua KieBases untuk KieModule tertentu . KieContainer dibina dengan bantuan kacang lain termasuk KieFileSystem, KieModule, dan KieBuilder.
Kaedah buildAll () yang digunakan pada KieBuilder membina semua sumber dan mengaitkannya dengan KieBase. Ia berjaya dilaksanakan hanya apabila dapat mencari dan mengesahkan semua fail peraturan:
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
Peraturan dipecahkan dengan membuka kacang KieSession - yang boleh diambil dari KieContainer:
public KieSession kieSession() throws IOException { return kieContainer().newKieSession(); }
5. Peraturan Pelaksanaan
Sekarang kita sudah selesai dengan penyiapan, mari kita lihat beberapa pilihan untuk membuat peraturan.
Kami akan meneroka pelaksanaan peraturan dengan contoh mengkategorikan pemohon untuk peranan tertentu, berdasarkan gaji dan jumlah pengalamannya selama ini.
5.1. Fail Peraturan Drools ( .drl )
Ringkasnya, fail peraturan Drools mengandungi semua peraturan perniagaan.
Peraturan merangkumi konstruk When-Then , di sini bahagian When menyenaraikan keadaan yang akan diperiksa, dan Kemudian bahagian menyenaraikan tindakan yang harus diambil jika syarat dipenuhi:
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
Peraturan ini boleh dipecat dengan memasukkan fakta Pemohon dan Peranan Disarankan dalam KieSession:
public SuggestedRole suggestARoleForApplicant( Applicant applicant,SuggestedRole suggestedRole){ KieSession kieSession = kieContainer.newKieSession(); kieSession.insert(applicant); kieSession.setGlobal("suggestedRole",suggestedRole); kieSession.fireAllRules(); // ... }
Ia menguji dua syarat pada contoh Pemohon dan kemudian berdasarkan pemenuhan kedua syarat itu menetapkan bidang Peranan dalam objek SuggestedRole .
Ini dapat disahkan dengan menjalankan ujian:
@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 yang disediakan Drools. Mari fahami penggunaannya:
- paket - ini adalah nama pakej yang kami tentukan dalam kmodule.xml, fail peraturan terletak di dalam pakej ini
- import - ini serupa denganpernyataan import Java, di sini kita perlu menentukan kelas yang kita masukkan dalam KnowledgeSession
- global - ini digunakan untuk menentukan pemboleh ubah peringkat global untuk sesi; ini dapat digunakan untuk melewati parameter input atau untuk mendapatkan parameter output untuk meringkaskan informasi untuk sesi
- dialek - dialek menentukan sintaks yang digunakan dalam ungkapan di bahagian keadaan atau bahagian tindakan. Secara lalai dialeknya adalah Java. Drools juga menyokong dialek mvel ; itu adalah bahasa ekspresi untuk aplikasi berbasis Java. Ia menyokong bidang dan kaedah / akses pengambil
- peraturan - ini menentukan blok peraturan dengan nama peraturan
- bila - ini menentukan syarat peraturan, dalam contoh ini syarat-syarat yang diperiksa adalah Pemohon yang mempunyai pengalaman Dalam tahun lebih dari sepuluh tahun dan sekarang Gaji dalam julat 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 mengesahkan hasil penggunaan peraturan ini dengan menjalankan ujian:
@Test public void whenProductTypeElectronic_ThenLabelBarcode() { Product product = new Product("Microwave", "Electronic"); product = productService.applyLabelToProduct(product); assertEquals("BarCode", product.getLabel()); }
6. Kesimpulannya
Dalam artikel ringkas ini, kami telah meneroka penggunaan Drools sebagai mesin peraturan perniagaan dalam aplikasi kami. Kami juga telah melihat pelbagai cara untuk menulis peraturan dalam bahasa peraturan Drools dan juga bahasa yang mudah difahami dalam hamparan.
Seperti biasa, kod lengkap untuk artikel ini terdapat di GitHub.