分类: Java
2007-03-19 09:19:45
加载jess引擎的代码部分:
public class PricingEngine {
private Rete engine;
private WorkingMemoryMarker marker;
private Database database;
public PricingEngine(Database aDatabase) throws JessException {
// Create a Jess rule engine
engine = new Rete();
engine.reset();
// Load the pricing rules
engine.batch("pricing.clp");//自动查找pricing.clp,无论它在当前目录下,还是封装在一个jar文件中,或是在web-inf/classes目录下,都能找到
// Load the catalog data into working memory
database = aDatabase;
engine.addAll(database.getCatalogItems());
// Mark end of catalog data for later
marker = engine.mark();
}
处理一条jess命令,需要四个步骤:重新设置引擎为初始状态,加载命令,执行规则,提取结果。加载命令的代码如下:
private void loadOrderData(int orderNumber) throws JessException {
// Retrive the order from the database
Order order = database.getOrder(orderNumber);
if (order != null) {
// Add the order and its contents to working memory
engine.add(order);
engine.add(order.getCustomer());
engine.addAll(order.getItems());
}
}
//执行命令并返回一个结果的的iterator,这结果需重新转换为java对象:
public Iterator run(int orderNumber) throws JessException {
// Remove any previous order data, leaving only catalog data
engine.resetToMark(marker);
// Load data for this order
loadOrderData(orderNumber);
// Fire the rules that apply to this order
engine.run();
// Return the list of offers created by the rules
return engine.getObjects(new Filter.ByClass(Offer.class));
}
而clp中的规则的内容则类似
Jess> (defrule 10%-volume-discount
"Give a 10% discount to everybody who spends more than $100."
(Order {total > 100})
=>
(add (new Offer "10% volume discount" (/ ?total 10))))
例子代码详见jess\examples\pricing_engine下。