Integrasi Drools Spring

1. Perkenalan

Dalam tutorial singkat ini, kita akan mengintegrasikan Drools dengan Spring. Jika Anda baru memulai dengan Drools, lihat artikel intro ini.

2. Ketergantungan Maven

Mari kita mulai dengan menambahkan dependensi berikut ke file pom.xml kita :

 org.drools drools-core 7.0.0.Final   org.kie kie-spring 7.0.0.Final 

Versi terbaru dapat ditemukan di sini untuk drools-core dan di sini untuk kie-spring.

3. Data Awal

Sekarang mari kita tentukan data yang akan digunakan dalam contoh kita. Kami akan menghitung tarif perjalanan berdasarkan jarak yang ditempuh dan bendera biaya tambahan malam.

Berikut objek sederhana yang akan digunakan sebagai Fakta:

public class TaxiRide { private Boolean isNightSurcharge; private Long distanceInMile; // standard constructors, getters/setters }

Mari kita tentukan juga objek bisnis lain yang akan digunakan untuk merepresentasikan tarif:

public class Fare { private Long nightSurcharge; private Long rideFare; // standard constructors, getters/setters }

Sekarang, mari kita tentukan aturan bisnis untuk menghitung tarif taksi:

global com.baeldung.spring.drools.model.Fare rideFare; dialect "mvel" rule "Calculate Taxi Fare - Scenario 1" when taxiRideInstance:TaxiRide(isNightSurcharge == false && distanceInMile < 10); then rideFare.setNightSurcharge(0); rideFare.setRideFare(70); end 

Seperti yang dapat kita lihat, aturan ditetapkan untuk menghitung total tarif dari TaxiRide yang diberikan .

Aturan ini menerima objek TaxiRide dan memeriksa apakah atribut isNightSurcharge salah dan nilai atribut distanceInMile kurang dari 10, lalu hitung tarifnya sebagai 70 dan set properti nightSurcharge ke 0.

Output yang dihitung diatur ke objek Tarif untuk digunakan lebih lanjut.

4. Integrasi Musim Semi

4.1. Konfigurasi Spring Bean

Sekarang, mari beralih ke integrasi Spring.

Kita akan mendefinisikan kelas konfigurasi kacang Spring - yang akan bertanggung jawab untuk membuat instance kacang TaxiFareCalculatorService dan dependensinya:

@Configuration @ComponentScan("com.baeldung.spring.drools.service") public class TaxiFareConfiguration { private static final String drlFile = "TAXI_FARE_RULE.drl"; @Bean public KieContainer kieContainer() { KieServices kieServices = KieServices.Factory.get(); KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); kieFileSystem.write(ResourceFactory.newClassPathResource(drlFile)); KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem); kieBuilder.buildAll(); KieModule kieModule = kieBuilder.getKieModule(); return kieServices.newKieContainer(kieModule.getReleaseId()); } } 

KieServices adalah singleton yang bertindak sebagai pintu masuk tunggal untuk mendapatkan semua layanan yang disediakan oleh Kie. KieServices diambil menggunakan KieServices.Factory.get ().

Selanjutnya, kita perlu mendapatkan KieContainer yang merupakan placeholder untuk semua objek yang kita perlukan untuk menjalankan mesin aturan.

KieContainer dibangun dengan bantuan kacang lain termasuk KieFileSystem, KieBuilder, dan KieModule.

Mari kita lanjutkan untuk membuat KieModule yang merupakan wadah dari semua sumber daya yang diperlukan untuk mendefinisikan pengetahuan aturan yang dikenal sebagai KieBase.

KieModule kieModule = kieBuilder.getKieModule();

KieBase adalah repositori yang berisi semua pengetahuan yang terkait dengan aplikasi seperti aturan, proses, fungsi, model tipe dan itu tersembunyi di dalam KieModule . The KieBase dapat diperoleh dari KieContainer.

Setelah KieModule dibuat, kita dapat melanjutkan untuk membuat KieContainer - yang berisi KieModule di mana KieBase telah ditentukan. The KieContainer dibuat menggunakan modul:

KieContainer kContainer = kieServices.newKieContainer(kieModule.getReleaseId());

4.2. Layanan Musim Semi

Mari kita tentukan kelas layanan yang mengeksekusi logika bisnis sebenarnya dengan meneruskan objek Fact ke mesin untuk memproses hasilnya:

@Service public class TaxiFareCalculatorService { @Autowired private KieContainer kieContainer; public Long calculateFare(TaxiRide taxiRide, Fare rideFare) { KieSession kieSession = kieContainer.newKieSession(); kieSession.setGlobal("rideFare", rideFare); kieSession.insert(taxiRide); kieSession.fireAllRules(); kieSession.dispose(); return rideFare.getTotalFare(); } } 

Terakhir, KieSession dibuat menggunakan instance KieContainer . Sebuah KieSession contoh adalah tempat di mana input data dapat dimasukkan. The KieSession berinteraksi dengan mesin untuk memproses logika bisnis yang sebenarnya didefinisikan dalam aturan berdasarkan Fakta dimasukkan.

Global (seperti variabel global) digunakan untuk meneruskan informasi ke mesin. Kita dapat mengatur Global menggunakan setGlobal ("key", value); dalam contoh ini, kami telah menetapkan objek Fare sebagai Global untuk menyimpan tarif taksi yang dihitung.

Sebagaimana kita bahas pada Bagian 4, sebuah Peraturan membutuhkan data untuk beroperasi pada . Kami memasukkan Fakta ke dalam sesi menggunakan kieSession .insert (taxiRide);

Setelah kita selesai dengan menyiapkan Fact input , kita dapat meminta mesin untuk menjalankan logika bisnis dengan memanggil fireAllRules ().

Terakhir, kita perlu membersihkan sesi untuk menghindari kebocoran memori dengan memanggil metode dispose () .

5. Contoh dalam Tindakan

Sekarang, kita dapat memasang konteks Musim Semi dan melihat dalam aksinya bahwa Drools bekerja seperti yang diharapkan:

@Test public void whenNightSurchargeFalseAndDistLessThan10_thenFixWithoutNightSurcharge() { TaxiRide taxiRide = new TaxiRide(); taxiRide.setIsNightSurcharge(false); taxiRide.setDistanceInMile(9L); Fare rideFare = new Fare(); Long totalCharge = taxiFareCalculatorService.calculateFare(taxiRide, rideFare); assertNotNull(totalCharge); assertEquals(Long.valueOf(70), totalCharge); }

6. Kesimpulan

Pada artikel ini, kita belajar tentang integrasi Drools Spring dengan kasus penggunaan sederhana.

Seperti biasa, implementasi contoh dan cuplikan kode tersedia di GitHub.