Drools - Hızlı Kılavuz
Kurumsal düzeyde herhangi bir Java uygulaması üç bölüme ayrılabilir -
- UI - Kullanıcı Arayüzü (Ön Uç)
- Bir veritabanına bağlı olan hizmet katmanı
- İş katmanı
Kullanıcı arayüzü ve hizmet katmanını birlikte işleyen bir dizi çerçeveye sahibiz, örneğin, Yay ve Dikmeler. Yine de, Drools ortaya çıkana kadar iş mantığını idare etmenin standart bir yolunu bulamadık.
Drools nedir?
Drools bir Business Logic integration Platform (BLiP). Java ile yazılmıştır. JBoss ve Red Hat, Inc. tarafından desteklenen açık kaynaklı bir projedir. Rete Pattern eşleştirme algoritmasını genişletir ve uygular.
Layman'ın terimleriyle, Drools, iş süreçlerinde bulunan mantık ve verileri ayırmamıza ve bunlar üzerinde mantık yürütmemize izin veren bir araç koleksiyonudur. Fark etmemiz gereken iki önemli anahtar kelimeLogic ve Data.
Drools iki ana bölüme ayrılmıştır: Authoring ve Runtime.
Authoring - Yazma süreci, Kural dosyalarının (.DRL dosyaları) oluşturulmasını içerir.
Runtime - Çalışma belleğinin yaratılmasını ve aktivasyonun yapılmasını içerir.
Kural Motoru nedir?
Drools, bir Kural Motoru veya Uzman Sistemi uygulamak için kural tabanlı yaklaşımı kullanan bir Üretim Kuralı Sistemidir. Uzman Sistemler, edinilen bilgiyi muhakeme için kullanılabilecek bir bilgi tabanına işlemek için bilgi temsilini kullanan bilgiye dayalı sistemlerdir.
Bir Üretim Kuralı Sistemi, önerme ve birinci dereceden mantığı özlü, belirsiz olmayan ve bildirimsel bir şekilde ifade etmek için bilgi temsiline odaklanan eksiksiz bir Turing'dir.
Bir Üretim Kuralları Sisteminin beyni bir Inference Engineçok sayıda kurala ve gerçeğe ölçeklenebilen. Çıkarım Motoru, gerçekleri ve verileri Üretim Kurallarına göre eşleştirir - aynı zamandaProductions ya da sadece Rules - eylemlerle sonuçlanan sonuçlara varmak.
Üretim Kuralı, bilgi temsili üzerinde akıl yürütmek için birinci dereceden mantığı kullanan iki bölümlü bir yapıdır. İş kuralı motoru, çalışma zamanı üretim ortamında bir veya daha fazla iş kuralını yürüten bir yazılım sistemidir.
Bir Kural Motoru, "What to Do" ve yok "How to do it. "
Kural nedir?
Kurallar bilginin parçaları genellikle olarak ifade edilir " Ne zaman bazı koşullar gerçekleştiğinde, o zaman bazı görevleri yapar."
When
<Condition is true>
Then
<Take desired Action>
Bir Kuralın en önemli kısmı, whenBölüm. Eğerwhen Kısmen memnun, then parça tetiklendi.
rule <rule_name>
<attribute> <value>
when
<conditions>
then
<actions>
end
Desen Eşleştirme
Yeni veya mevcut gerçekleri Üretim Kurallarıyla eşleştirme sürecine, Çıkarım Motoru tarafından gerçekleştirilen Kalıp Eşleştirme adı verilir. Örüntü Eşleştirme için kullanılan birkaç algoritma vardır:
- Linear
- Rete
- Treat
- Leaps
Drools Rete Algoritmasını uygular ve genişletir. Drools Rete uygulaması, Drools'un nesne yönelimli sistemler için geliştirilmiş ve optimize edilmiş bir Rete algoritması uygulamasına sahip olduğunu belirten ReteOO olarak adlandırılır.
Bir Kural Motorunun Avantajları
Bildirime Dayalı Programlama
Kurallar, zor sorunlara çözüm ifade etmeyi ve aynı zamanda çözümlerin doğrulanmasını kolaylaştırır. Kodlardan farklı olarak, Kurallar daha az karmaşık bir dilde yazılır; İş Analistleri bir dizi kuralı kolayca okuyabilir ve doğrulayabilir.
Mantık ve Veri Ayrımı
Veriler Etki Alanı Nesnelerinde bulunur ve iş mantığı Kurallarda bulunur. Projenin türüne bağlı olarak, bu tür bir ayırma çok avantajlı olabilir.
Hız ve Ölçeklenebilirlik
Drools'un üzerine yazıldığı Rete OO algoritması zaten kanıtlanmış bir algoritmadır. Drools'un yardımıyla uygulamanız çok ölçeklenebilir hale gelir. Sık sık değişiklik talepleri varsa, mevcut kuralları değiştirmek zorunda kalmadan yeni kurallar eklenebilir.
Bilginin Merkezileştirilmesi
Kuralları kullanarak, çalıştırılabilir bir bilgi havuzu (bilgi tabanı) oluşturursunuz. İş politikası için tek bir doğruluk noktasıdır. İdeal olarak, Kurallar o kadar okunabilir ki, aynı zamanda belge işlevi görebilirler.
Araç Entegrasyonu
Eclipse gibi araçlar, kuralları düzenleme ve yönetme ve anında geri bildirim, doğrulama ve içerik yardımı alma yolları sağlar. Denetim ve hata ayıklama araçları da mevcuttur.
İşte Drools Eklentisini kurmak için ön koşullar -
- Java 1.5 (veya üstü) SE JDK
- Eclipse 4.2 (veya herhangi bir sürüm) ve Drools eklentisi
Drools, Java ile yazılmış bir BRMS (Business Rule Management System) olduğundan, bu bölümde istenen eklentilerin nasıl ekleneceğini ele alacağız. Maksimum Java kullanıcısının Eclipse kullandığını göz önünde bulundurarak, Drools 5.x.0 eklentisini Eclipse'e nasıl ekleyeceğimize bakalım.
Adım 1: İkilileri İndirin
İkili dosyaları aşağıdaki bağlantıdan indirin -
https://download.jboss.org/drools/release/5.3.0.Final/
İndirme işlemi tamamlandıktan sonra dosyaları sabit diskinize çıkartın.
Adım 2: Yazılımı Yükleyin
Eclipse'i başlatın ve yardım → yeni yazılımı kur'a gidin. Aşağıdaki ekran görüntüsünde gösterildiği gibi Ekle'ye tıklayın.
Daha sonra burada gösterildiği gibi Yerel'e tıklayın ve "… / binaries / org.drools.updatesite" seçeneğini seçin.
Drools ve jBPM'yi seçin ve İleri'ye tıklayın.
Tekrar İleri'ye tıklayın. Daha sonra, şartları ve lisans sözleşmesini kabul edin ve Bitir'e tıklayın.
Bitir'e tıkladıktan sonra, yazılım kurulumu başlar -
Başarılı bir kurulumun ardından aşağıdaki iletişim kutusunu göreceksiniz -
Evet'e tıklayın. Eclipse yeniden başladığında, Windows → Tercihler'e gidin.
Drools'u tercihleriniz altında görebilirsiniz. Drools eklenti kurulumunuz şimdi tamamlandı.
Drools Runtime, editöre programı belirli bir Drools jar sürümüyle çalıştırma talimatı vermek için gereklidir. Programınızı / uygulamanızı farklı Drools Runtime ile çalıştırabilirsiniz.
Windows → Tercih → Drools → Yüklü Drools Çalışma Zamanı'na tıklayın. Ardından aşağıdaki ekran görüntüsünde gösterildiği gibi Ekle'ye tıklayın.
Daha sonra, burada gösterildiği gibi Yeni bir Drools Çalışma Zamanı Oluştur'a tıklayın.
Droolsjbpm-tools-distribution-5.3.0.Final.zip dosyasını indirdiğiniz ikili dosyalar klasörüne kadar yolu girin.
Tamam'a tıklayın ve Drools Çalışma Zamanı için bir isim girin. Drools çalışma zamanı şimdi oluşturuldu.
Temel bir Drools programı oluşturmak için Eclipse'i açın. Fileb → New → Project'e gidin.
Drools Project'i seçin. Proje için uygun bir isim veriniz. Örneğin, DroolsTest.
Sonraki ekran, ilk Drools projenizde istediğiniz bazı dosyaları seçmenizi ister.
İlk iki dosyayı seçin. İlk dosya bir .drl dosyasıdır (Drools Kural Dosyası) ve ikinci dosya, HelloWorld kuralını yüklemek ve yürütmek için bir Java sınıfıdır.
İleri → Bitir'e tıklayın.
Finish'e tıkladığınızda, çalışma alanınızda bir <DroolsTest> projesi oluşturulur. Java sınıfını açın ve ardından sağ tıklayın ve Java uygulaması olarak çalıştırın. Çıkışı burada gösterildiği gibi görürsünüz -
Daha sonra, bir Kural Motorunda sıkça kullanılan terimleri tartışacağız.
Kurallar
Koşulları belirttiğiniz Kural Motorunun kalbi ("a" ise "b" ise).
Gerçekler
Gerçekler, kuralların üzerinde hareket edeceği verilerdir. Java perspektifinden Gerçekler, POJO'dur (Düz Eski Java Nesnesi).
Oturum, toplantı, celse
Drools'da bir Bilgi Oturumu, kuralları ateşleyen temel bileşendir. Tüm kuralları ve diğer kaynakları içeren bilgi seansıdır. Bilgi Tabanından bir Bilgi Oturumu oluşturulur.
Kural motorunun çalışması için, gerçekler oturuma eklenir ve bir koşul karşılandığında, sonraki kural çalıştırılır. Bir Oturum iki türdendir -
- Durumsuz Bilgi Oturumu
- Durum Bilgili Bilgi Oturumu
Gündem
Mantıklı bir kavram. Gündem, aktivasyonların ateşlenmeyi beklediği mantıksal yerdir.
Aktivasyonlar
Aktivasyonlar, thenkuralın bir parçası. Etkinleştirmeler, uygun kuralın tetiklendiği gündeme alınır.
Hello World projesinde (Sample.drl) yazılan varsayılan kuralı görürseniz, şimdi açıklayacağımız birçok anahtar kelime kullanılmıştır.
Sample.drl
Package- Her Kural bir paket adıyla başlar. Paket, Kurallar için bir ad alanı görevi görür. Bir paket içindeki kural adları benzersiz olmalıdır. Kurallardaki paketler, Java'daki paketlere benzer.
Import statement- Kuralı uygulamak istediğiniz gerçekler ne olursa olsun, bu gerçeklerin içe aktarılması gerekir. Örneğin, com.sample.DroolsTest.Message; yukarıdaki örnekte.
Rule Definition- Kural Adı, koşul ve Sonuçtan oluşur. Drools anahtar kelimelerirule, when, then, ve end. Yukarıdaki örnekte, kural adları "Merhaba Dünya" ve "Hoşçakal" dır. when kısım hem kurallarda hem de thensonuç kısmıdır. Kural terminolojisinde,when bölüm ayrıca LHS (sol taraf) olarak da adlandırılır ve then kuralın sağ tarafı (sağ taraf) olarak bölüm.
Şimdi Drool'ları yüklemek ve kuralları uygulamak için kullanılan Java dosyasında kullanılan terimleri inceleyelim.
Bilgi tabanı
Bilgi Tabanı, bir kurallar, süreçler ve dahili türler koleksiyonunu yöneten bir arabirimdir. Paketin içinde bulunurorg.drools.KnowledgeBase. Drools'da bunlara genellikleknowledge definitions veya knowledge. Bilgi tanımları şu şekilde gruplandırılır:knowledge packages. Bilgi tanımları eklenebilir veya kaldırılabilir. Bilgi Bankası'nın temel amacı, bunları depolamak ve yeniden kullanmaktır çünkü bunların oluşturulması pahalıdır. Bilgi Bankası, bilgi oturumları oluşturmak için yöntemler sağlar.
Bilgi Oturumu
Bilgi oturumu, bilgi tabanından alınır. Drools Engine ile etkileşim için ana arayüzdür. Bilgi oturumu iki tür olabilir -
Durumsuz Bilgi Oturumu
Durum Bilgili Bilgi Oturumu
Durumsuz Bilgi Oturumu
Durumsuz Bilgi Oturumu, çıkarımdan yararlanmadan en basit kullanım örneğini oluşturan durumsuz bir oturumdur. Durumsuz bir oturum, bir işlev gibi çağrılabilir, ona bazı verileri iletebilir ve ardından bazı sonuçları geri alabilir. Vatansız oturumun yaygın örnekleri şunlardır:
Validation
Bu kişi ipotek için uygun mu?
Calculation
Bir ipotek primi hesaplayın.
Routing and Filtering
E-postalar gibi gelen mesajları klasörler halinde filtreleyin.
Gelen mesajları bir hedefe gönder
Durum Bilgili Bilgi Oturumu
Durum bilgisi olan oturumlar daha uzun ömürlüdür ve zaman içinde yinelemeli değişikliklere izin verir. Durum bilgisi olan oturumlar için bazı yaygın kullanım örnekleri şunlardır:
Monitoring
Yarı otomatik satın alma için borsa izleme ve analizi.
Diagnostics
Arıza bulma, tıbbi teşhis
Logistics
Paket izleme ve teslimat sağlama
Bilgi Oluşturucu
KnoledgeBuilder arayüzü, bilgi tanımlarından (kurallar, süreçler, türler) bir Bilgi Paketi oluşturmaktan sorumludur. Paketin içinde bulunurorg.drools.builder.KnowledgeBuilder. Bilgi tanımları çeşitli formatlarda olabilir. Oluşturmayla ilgili herhangi bir sorun varsa, KnowledgeBuilder hataları şu iki yöntemle bildirir:hasErrors ve getError.
Aşağıdaki şema süreci açıklamaktadır
Yukarıdaki örnekte, basit bir durum bilgisi olmayan bilgi oturumu örneğini alırken, olguyu oturuma ekledik ve ardından fireAllRules () yöntemi çağrıldı ve çıktıyı görüyorsunuz.
Durum bilgisi olan bir bilgi oturumu durumunda, kurallar tetiklendikten sonra, durum bilgisi olan bilgi oturumu nesnesi yöntemi çağırmalıdır dispose() oturumu serbest bırakmak ve bellek sızıntılarını önlemek için.
.Drl'nin (kural dosyası) kendi sözdizimi olduğunu gördüğünüz gibi, bu bölümde Kural sözdiziminin bazı kısımlarını ele alalım.
Kurallardaki Koşullar
Bir kural, aşağıdakiler gibi birçok koşul ve kalıp içerebilir:
- Hesap (bakiye == 200)
- Müşteri (name == "Vivek")
Yukarıdaki koşullar Hesap bakiyesinin 200 olup olmadığını veya Müşteri adının "Vivek" olup olmadığını kontrol eder.
Kurallardaki Değişkenler
Drools'daki değişken adı Dolar ($) sembolü ile başlar.
- $ hesap - Hesap ()
- $ hesap, Account () sınıfı için değişkendir
Drools, tüm yerel Java türleri ve hatta Enum ile çalışabilir.
Kurallardaki Yorumlar
Özel karakterler, # veya //, tek satırlı açıklamaları işaretlemek için kullanılabilir.
Çok satırlı yorumlar için aşağıdaki biçimi kullanın:
/*
Another line
.........
.........
*/
Global Değişkenler
Global değişkenler, bir oturuma atanan değişkenlerdir. Aşağıdaki gibi çeşitli nedenlerle kullanılabilirler -
Giriş parametreleri için (örneğin, oturumdan oturuma özelleştirilebilen sabit değerler).
Çıktı parametreleri için (örneğin, raporlama - bir kural genel rapor değişkenine bazı mesajlar yazabilir).
Kurallar dahilinde kullanılabilen, günlük kaydı gibi hizmetler için giriş noktaları.
Kurallardaki İşlevler
İşlevler, kullanışlı bir özelliktir. Koşullarda ve sonuçlarda kullanılabilirler. Fonksiyonlar, yardımcı program / yardımcı sınıflara bir alternatifi temsil eder. Örneğin,
function double calculateSquare (double value) {
return value * value;
}
Lehçe
Bir lehçe, bir koşulda veya sonuçta bulunan herhangi bir kod ifadesinde kullanılan sözdizimini belirtir. Dönen değerleri, evalleri, satır içi değerlendirmeleri, yüklemleri, belirgin ifadeleri, sonuçları vb. İçerir. Varsayılan değerJava. Drools şu anda adında bir lehçeyi daha destekliyorMVEL. Varsayılan lehçe, paket düzeyinde aşağıdaki şekilde belirtilebilir -
package org.mycompany.somePackage
dialect "mvel"
MVEL Lehçesi
MVEL, Java tabanlı uygulamalar için bir ifade dilidir. Alan ve yöntem / alıcı erişimini destekler. Java sözdizimine dayanmaktadır.
Dikkat
Dikkat Çekme, Kural Sözdiziminin çok önemli bir özelliğidir. Belirginlik, hangi kuralın önce ateşleneceğine karar vermek için çatışma çözme stratejisi tarafından kullanılır. Varsayılan olarak, ana kriter budur.
Atış kurallarının sırasını tanımlamak için çıkıntıyı kullanabiliriz. Salience, bir dizi int türü döndüren herhangi bir ifadeyi alan bir özelliğe sahiptir (hem pozitif hem de negatif sayılar geçerlidir). Değer ne kadar yüksekse, uyuşmazlık çözme stratejisi tarafından bir kuralın devreye girme olasılığı o kadar yüksektir.
salience ($account.balance * 5)
Varsayılan belirginlik değeri 0'dır. Yalnızca bazı kurallara belirginlik değerleri atarken bunu aklımızda tutmalıyız.
Kural Sözdiziminde birçok başka özellik / parametre vardır, ancak burada yalnızca önemli olanları ele aldık.
Kural Sonuç Anahtar Kelimeleri
Kural Sonucu Anahtar Kelimeler, "then"Kuralın bir parçası.
Modify - Gerçeğin öznitelikleri, then Kuralın bir parçası.
Insert - Bazı koşullara bağlı olarak, eğer doğruysa, Kural Motorunun mevcut oturumuna yeni bir olgu eklenebilir.
Retract - Bir Kuralda belirli bir koşul doğruysa ve bu gerçeğe göre başka bir şey yapmak istemiyorsanız, belirli gerçeği Kural Motorundan geri çekebilirsiniz.
Note- Bir kural sonucu içinde koşullu bir mantığa (eğer ifadeler) sahip olmak çok kötü bir uygulama olarak kabul edilir. Çoğu zaman yeni bir kural oluşturulmalıdır.
Bu bölümde, aşağıdaki problem ifadesi için bir Drools projesi oluşturacağız -
Şehre ve ürün türüne bağlı olarak (Şehir ve Ürün Kombinasyonu), o şehirle ilgili yerel vergiyi öğrenin.
Drools projemiz için iki DRL dosyamız olacak. İki DRL dosyası, dikkate alınan iki şehri (Pune ve Nagpur) ve dört tür ürünü (bakkaliye, ilaçlar, saatler ve lüks mallar) belirtecektir.
Her iki şehirde de ilaç vergisi sıfır olarak kabul ediliyor.
Yiyecekler için, Pune'da Rs 2 ve Nagpur'da Rs 1 vergi aldık.
Farklı çıktıları göstermek için aynı satış fiyatını kullandık. Uygulamada tüm kuralların kovulduğunu unutmayın.
İşte her itemType'ı tutan model -
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;
}
}
DRL Dosyaları
Daha önce önerildiği gibi, burada iki DRL dosyası kullandık: Pune.drl ve Nagpur.drl.
Pune.drl
Bu, Pune şehri için kuralları uygulayan DRL dosyasıdır.
// 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
Bu, Nagpur şehri için kuralları uygulayan DRL dosyasıdır.
// 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
DRL dosyalarını şehre göre yazdık, çünkü daha sonra yeni şehirler ekleniyorsa herhangi bir sayıda kural dosyası eklemek için genişletilebilirlik sağlıyor.
Tüm kuralların kural dosyalarımızdan tetiklendiğini göstermek için iki öğe türü kullandık (ilaçlar ve yiyecekler); ve ilaçlar vergiden muaftır ve bakkallar şehre göre vergilendirilir.
Test sınıfımız kural dosyalarını yükler, gerçekleri oturuma ekler ve çıktıyı üretir.
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;
}
}
Bu programı çalıştırırsanız, çıktısı aşağıdaki gibi olacaktır -
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10
Hem Pune hem de Nagpur için, madde bir ilaç olduğunda, yerel vergi sıfırdır; Oysa ürün bir bakkal ürünü olduğunda, vergi şehir başıdır. Diğer ürünler için DRL dosyalarına daha fazla kural eklenebilir. Bu sadece örnek bir programdır.
DRL Dosyasından Harici İşlevi çağırın
Burada, DRL dosyanızdaki bir Java dosyasından statik bir işlevi nasıl çağıracağınızı göstereceğiz.
Öncelikle bir sınıf oluşturun HelloCity.java aynı pakette com.sample.
package com.sample;
public class HelloCity {
public static void writeHello(String name) {
System.out.println("HELLO " + name + "!!!!!!");
}
}
Daha sonra, DRL dosyasından writeHello yöntemini çağırmak için DRL dosyasına import deyimini ekleyin. Aşağıdaki kod bloğunda, Pune.drl DRL dosyasındaki değişiklikler sarı ile vurgulanmıştır.
// 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
Programı tekrar çalıştırın ve çıktısı aşağıdaki gibi olacaktır -
HELLO PUNE!!!!!!
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10
Şimdi çıktıdaki fark, Java sınıfındaki statik yöntemin çıktısını gösteren sarı ile işaretlenmiştir.
Java yöntemini çağırmanın avantajı, herhangi bir yardımcı program / yardımcı işlevi Java'da yazabilmemiz ve bunu bir DRL dosyasından çağırabilmemizdir.
Bir Drools projesinde hata ayıklamanın farklı yolları vardır. Burada, hangi kuralların tetiklendiğini veya tetiklendiğini size bildirmek için bir Utility sınıfı yazacağız.
Bu yaklaşımla, Drools projenizde hangi kuralların tetiklendiğini kontrol edebilirsiniz. İşte Yardımcı Sınıfımız
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());
}
}
İlk yöntem help DRL dosyası aracılığıyla Dize olarak iletebileceğiniz bazı ekstra bilgilerle birlikte tetiklenen kuralı yazdırır.
İkinci kural helper belirli kuralın tetiklenip tetiklenmediğini yazdırır.
Her DRL dosyasına Yardımcı Yöntem yöntemlerinden birini ekledik. DRL dosyasına (Pune.drl) içe aktarma işlevini de ekledik. İçindethenkuralın bir parçası olarak, fayda fonksiyonu çağrısını ekledik. Değiştirilmiş Pune.drl aşağıda verilmiştir. Değişiklikler mavi renkle vurgulanmıştır.
Değiştirilmiş 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
Benzer şekilde, diğer yardımcı program işlevini ikinci DRL dosyasına (Nagpur.drl) ekledik. İşte değiştirilen kod -
Değiştirilmiş Nagpur.drl
// 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
Programı tekrar çalıştırın ve aşağıdaki çıktıyı üretmelidir -
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
Her iki yardımcı program işlevi de çağrılır ve belirli kuralın çağrılıp çağrılmadığını gösterir. Yukarıdaki örnekte, tüm kurallar çağrılmaktadır, ancak bir kurumsal uygulamada, bu yardımcı program işlevi, belirli bir kuralın çalıştırılıp çalıştırılmadığını hata ayıklamak ve bulmak için gerçekten yararlı olabilir.
Eclipse'de Hata Ayıklama Perspektifini Kullanma
Drools uygulamanızın yürütülmesi sırasında kurallarda hata ayıklayabilirsiniz. Kurallarınızın sonuçlarına kesme noktaları ekleyebilirsiniz ve kuralların yürütülmesi sırasında böyle bir kesme noktasıyla karşılaşıldığında, yürütme geçici olarak durdurulur. Daha sonra o noktada bilinen değişkenleri bir Java Uygulamasında yaptığınız gibi inceleyebilir ve Eclipse'de bulunan normal hata ayıklama seçeneklerini kullanabilirsiniz.
DRL dosyanızda bir kesme noktası oluşturmak için, bir kesme noktası oluşturmak istediğiniz satırı çift tıklamanız yeterlidir. Unutmayın, yalnızca şurada bir kesme noktası oluşturabilirsiniz:thenbir kuralın parçası. DRL düzenleyicisinde kesme noktasına çift tıklayarak bir kesme noktası kaldırılabilir.
Kesme noktalarını uyguladıktan sonra, uygulamanızda bir Drools uygulaması olarak hata ayıklamanız gerekir. Drools kesme noktaları (DRL dosyasındaki kesme noktaları) yalnızca uygulamanızın bir Drools uygulaması olarak hata ayıklaması yapılıyorsa çalışır. İşte aynısını nasıl yapmanız gerektiği -
Uygulamanızda bir Drools uygulaması olarak hata ayıkladıktan sonra, aşağıdaki ekran görüntüsünde gösterildiği gibi DRL dosyasındaki kontrolü görürsünüz -
Bu hata ayıklama noktasında nesnenin değişkenlerini ve mevcut değerlerini görebilirsiniz. Bir sonraki satıra geçmek için F6'nın ve bir sonraki hata ayıklama noktasına atlamak için F8'in aynı kontrolü burada da uygulanabilir. Bu şekilde, Drools uygulamanızda hata ayıklayabilirsiniz.
Note - Drools uygulamasındaki hata ayıklama perspektifi, yalnızca lehçe MVEL ise Drools 5.x'e kadar çalışır.