2016-04-08 14 views
4

Drools 5.x'ten 6.x'e yükseltmeye çalışıyorum ve işleri olabildiğince basit tutmaya çalışıyorum. Yeni kie API'leri bu basit görevi zorlaştırıyor.Yeni Drools 6.x KIE API'si nasıl çalışır?

Birçok denemeden sonra standart Drools 5.x örneğini 6.x eşdeğerine dönüştürmeyi başardım. XML konfigürasyon dosyalarını, bağımlılık enjeksiyonunu vb. Engellediğime dikkat edin ama hala bazı geçitleri anlamıyorum.

Uygulamamın her iki sürümüne de dahil olmak üzere, sahip olduğum aynı sorunu yaşayan diğer kişilere yardımcı olabilirim.

Aşağıdaki kodu az ya da çok biz Drools 5.x yapardık ne:

// Obtain a builder for knowledge base 
KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 

// Load a DRL resource from src/main/resources into the builder 
String location = "/drools/HelloWorld.drl"; 
InputStream stream = getClass().getResourceAsStream(location); 
Resource resource = ResourceFactory.newInputStreamResource(stream); 
builder.add(resource, ResourceType.DRL); 

// Check for errors, print them and stop if any 
if (builder.hasErrors()) { 
    for (KnowledgeBuilderError error : builder.getErrors()) { 
     System.out.println(error); 
    } 
    System.exit(0); 
} 

// Create a new knowledge base out of the builder 
KnowledgeBase base = KnowledgeBaseFactory.newKnowledgeBase(); 
base.addKnowledgePackages(builder.getKnowledgePackages()); 

// Start a new working session 
StatefulKnowledgeSession session = base.newStatefulKnowledgeSession(); 

// Inject a new message object into the session 
final Message message = new Message(); 
message.setMessage("Hello World"); 
message.setStatus(Message.HELLO); 
session.insert(message); 

// Apply the rules in the knowledge base to the objects in the session 
session.fireAllRules(); 

// Close the working session 
session.dispose(); 

Drools 6.x beri KnowledgeBase kullanımdan kaldırıldı yüzden olacak kod temeli dışarı muhtemelen faz içinde Yakın gelecek, yeni API'ları kullanmaya zorlanıyor. Drools 6.x yukarıdaki örnek olur:

// Get access to Drools services 
KieServices services = KieServices.Factory.get(); 

// Obtain a new empty virtual file system 
KieFileSystem fileSystem = services.newKieFileSystem(); 

// Load a DRL resource from src/main/resources into the virtual file system 
// The prefix 'src/main/resources' is required since Drools 6.2.x 
String location = "/drools/HelloWorld.drl"; 
InputStream stream = getClass().getResourceAsStream(location); 
Resource resource = ResourceFactory.newInputStreamResource(stream); 
fileSystem.write("src/main/resources" + location, resource); 

// Convert the files in the virtual file system into a builder 
KieBuilder builder = services.newKieBuilder(fileSystem).buildAll(); 

// Check for errors, print them and stop if any 
Results results = builder.getResults(); 
if (results.hasMessages(ERROR)) { 
    System.out.println(results.getMessages()); 
    System.exit(0); 
} 

// Create a new kie base out of a repository and a container 
KieRepository repository = services.getRepository(); // <---= HERE! 
KieContainer container = services.newKieContainer(repository.getDefaultReleaseId()); 
KieBase base = container.getKieBase(); 

// Start a new working session 
KieSession session = base.newKieSession(); 

// Inject a new message object into the session 
final Message message = new Message(); 
message.setMessage("Hello World"); 
message.setStatus(Message.HELLO); 
session.insert(message); 

// Apply the rules in the kie base to the objects in the session 
session.fireAllRules(); 

// Close the working session 
session.dispose(); 

zamanlarda bu yeni API'LARI çok ayrıntılı ve anlaşılması biraz belirsiz olduğunu düşünüyorum. Bunların arkasındaki nedenlerden birinin, kural tabanlarının daha kolay yönetilmesine izin vermek olduğunu biliyorum (yani, paketler) ancak uygulamanın biraz karışık ve aracıya adalet yapamamasıdır (yani: benimseme daha zordur).

xml yapılandırma dosyalarını veya bağımlılık enjeksiyonunu kullanmanın kodu daha basit hale getirdiğini, ancak ilkinin akışı bozduğunu ve ikincisinin (birçok) daha fazla bağımlılığın dahil edilmesini zorladığını biliyorum. Dahası, her iki durumda da neler olup bittiğini anlamak daha da zorlaşır. KieRepository tanıtıldı nerede

Ancak geri soruya gidiyor, ikinci ön bilgide satır fark:

KieRepository repository = services.getRepository(); // <---= HERE! 

services döner bir olan varsayılan bırakma kimliği KieContainer başlatmak için kullanılır KieRepository. Bu kapsayıcı, gerektiğinde KieSession s üreten bir KieBase üretir. DRL dosyası ile dosya sistemini içeren önceden başlatılan KieBuilder, KieBase almak için herhangi bir yere kullanılmadığına dikkat edin.KieBase DRL dosyasını nasıl biliyor? KieServices bazı yan etkisi ile? Eğer öyleyse, bu kötü değil mi?

Sahip olabileceğiniz herhangi bir fikir veya açıklama için şimdiden teşekkür ederiz.

+0

Burada yanıtlanacak hiçbir şey yok: Sorunuza çok güzel bir şekilde koydunuz!Ve bir FileSystem ve bazı Deposu ReleaseId ile oluşturulan bir Container üzerinde çalışan ve bir KieBase'i (Builder'ın yaptığı gibi olmalı) başaran bazı Builder'ın bu içsel ilişkisinin kesinlikle şaşırtıcı olduğuna inanıyorum. Drools belgelerinden geçtim, ve sadece bu varlıklar arasındaki * bağlantıları açıklamakta başarısız oluyor - sadece her bir varlığın özelliklerini açıklıyor, ki bu sizin esasları çıkarmanız gerekiyor. – laune

+0

@laune Görüşümü paylaştığınızı gördüğüme sevindim! Dürüst olmak gerekirse, Drools belgelerinin doğru ve eksiksiz olması için hiç bir zaman hatırlanmamıştır (en azından v4.3'ten beri kullanıyorum). Sadece aptalca (yani RETE/OO, PHREAK eksik) ama çok daha kompakt ve fırfırlar olmayan Kolay Kurallar (http://www.easyrules.org) üzerine tökezledim! Kuralların ve beta düğümlerin ele alınış şekli optimize edilmese bile hoşuma gidiyor. –

+0

Aslında EasyRules, tam teşekküllü bir Üretim Kuralları Sistemi ile işlevsel olarak karşılaştırılamaz, ancak bağlantı noktalarından biri olan MintRules (https://github.com/augusto/MintRules) - ümit vericidir. –

cevap

0

Stefano, uygulamanızda yalnızca bir grup drl yüklemek istiyorsanız ve KieContainers, Maven eserleri veya KieScanner hakkında endişelenmiyorsanız, KieHelper sınıfını kullanabilirsiniz.

Daha fazla bilgi için, bkz. my answer to this other post.

Burada tek dezavantaj KieHelper'ın Drools'un public API'sinin bir parçası olmamasıdır.

Yardım edin,

+1

Merhaba Esteban, tekrar sizden okumak güzel! Teşekkürler, yardımcı sınıf gerçekten kodu sadeleştiriyor, ancak hala kaputun altında neler olup bittiğini anlamak için yardımcı olmuyor ... Her neyse, çalışma zamanında bir oturuma kural eklemek için izin veren KieHelper' nedir? (Bu soruya bakınız: http://stackoverflow.com/questions/36502310/how-to-dynamically-change-the-rules-of-a-given-drools-6-3-session) –

+0

Merhaba Stefano. Hayır, eğer KieBases'ınızı çalışma zamanında değiştirmek istiyorsanız, Drools 6.x'deki 'KieScanner' sınıfına bir göz atmak isteyebilirsiniz. –

İlgili konular