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.
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
@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. –
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. –