Integrasi Drools Spring

1. Pengenalan

Dalam tutorial ringkas ini, kita akan menggabungkan Drools dengan Spring. Sekiranya anda baru memulakan Drools, baca artikel intro ini.

2. Pergantungan Maven

Mari mulakan dengan menambahkan kebergantungan berikut ke fail pom.xml kami :

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

Versi terkini boleh didapati di sini untuk drools-core dan di sini untuk kie-spring.

3. Data Permulaan

Sekarang mari kita tentukan data yang akan digunakan dalam contoh kita. Kami akan mengira harga perjalanan berdasarkan jarak perjalanan dan bendera surcaj malam.

Inilah objek ringkas yang akan dijadikan Fakta:

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

Mari juga tentukan objek perniagaan lain yang akan digunakan untuk mewakili tambang:

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

Sekarang, mari kita tentukan peraturan perniagaan untuk mengira tambang teksi:

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, peraturan ditetapkan untuk mengira jumlah tambang TaxiRide yang diberikan .

Peraturan ini menerima satu TaxiRide objek dan cek jika isNightSurcharge atribut adalah palsu dan distanceInMile nilai atribut adalah kurang daripada 10, kemudian mengira tambang 70 dan menetapkan nightSurcharge harta kepada 0.

Output yang dikira ditetapkan ke objek Fare untuk penggunaan selanjutnya.

4. Integrasi Musim Bunga

4.1. Konfigurasi Kacang Musim Bunga

Sekarang, mari kita beralih ke integrasi Spring.

Kami akan menentukan kelas konfigurasi kacang kacang - yang akan bertanggungjawab untuk memberi contoh kacang TaxiFareCalculatorService dan kebergantungannya:

@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 satu titik masuk untuk mendapatkan semua perkhidmatan yang disediakan oleh Kie. KieServices diambil menggunakan KieServices.Factory.get ().

Seterusnya, kita perlu mendapatkan KieContainer yang merupakan placeholder untuk semua objek yang kita perlukan untuk menjalankan enjin peraturan.

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

Mari terus membuat KieModule yang merupakan wadah semua sumber yang diperlukan untuk menentukan pengetahuan peraturan yang dikenali sebagai KieBase.

KieModule kieModule = kieBuilder.getKieModule();

KieBase adalah repositori yang berisi semua pengetahuan yang berkaitan dengan aplikasi seperti peraturan, proses, fungsi, model jenis dan ia tersembunyi di dalam KieModule . The KieBase boleh diperolehi dari KieContainer.

Setelah KieModule dibuat, kita dapat terus membuat KieContainer - yang mengandungi KieModule di mana KieBase telah ditentukan. The KieContainer adalah dicipta menggunakan modul:

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

4.2. Perkhidmatan Musim Bunga

Mari kita tentukan kelas perkhidmatan yang melaksanakan logik perniagaan sebenar dengan menyampaikan objek Fakta 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(); } } 

Akhirnya, KieSession dibuat menggunakan instance KieContainer . Contoh KieSession adalah tempat di mana data input dapat dimasukkan. The KieSession berinteraksi dengan enjin memproses logik perniagaan sebenar ditakrifkan dalam kaedah berdasarkan Fakta dimasukkan.

Global (seperti pemboleh ubah global) digunakan untuk menyampaikan maklumat ke dalam enjin. Kita dapat menetapkan Global menggunakan setGlobal ("kunci", nilai); dalam contoh ini, kami telah menetapkan objek Fare sebagai Global untuk menyimpan tambang teksi yang dikira.

Seperti yang kita dibincangkan dalam Seksyen 4, yang Rule memerlukan data untuk beroperasi . Kami memasukkan Fakta ke dalam sesi menggunakan kieSession .insert (taxiRide);

Setelah kita selesai dengan menyiapkan input Fakta, kita dapat meminta mesin untuk menjalankan logik perniagaan dengan memanggil fireAllRules ().

Akhirnya, kita perlu membersihkan sesi untuk mengelakkan kebocoran memori dengan memanggil kaedah buang () .

5. Contoh dalam Tindakan

Sekarang, kita dapat menyusun konteks Spring dan melihat tindakan Drools berfungsi 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. Kesimpulannya

Dalam artikel ini, kami belajar mengenai penyatuan Drools Spring dengan kes penggunaan yang mudah.

Seperti biasa, pelaksanaan contoh dan potongan kod boleh didapati di GitHub.