无法在流口水规则文件中的 KIE 有状态会话中检索会话对象



在流口水规则文件(drt(中,我将产品ID和客户名称存储在会话中。我想仅在针对该特定客户和产品时应用折扣,折扣尚未应用。

模板文件的格式 (Excel(

ProductID     Quatntity       Discount     
Item_1           10            15    
Item_2           20            20   

下面是 drt 文件

template header
ProductId
Quantity
Discount
package com.main.discount;
dialect "java"

import java.util.Random;
import java.time.LocalDateTime;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import com.main.discount.Customer;
declare Discount
lCurrentTime: long
lCustomerName: String
lProductId: String
lExist: boolean
@timestamp(currentTime)
end
function Discount addDiscount(String productId,String customerName) {
Discount newRecord = new Discount();
newRecord.setLCustomerName(customerName);
newRecord.setLProductId(productId);
newRecord.setLCurrentTime(LocalDateTime.now().toEpochSecond(ZoneOffset.UTC));
newRecord.setLExist(true);   
return newRecord;
}
template "OperationalMeasurement"
rule "Apply_Discount_@{row.rowNumber}"
no-loop
lock-on-active
salience 400
when
$c: Customer(productId == "@{ProductId}" ,$productId: productId && quantity >= "@{Quantity}" , $quantity: quantity, $customer: CustomerName)
not (Discount(lProductId == $productId, lCustomerName == $customer))
then   
$c.setDiscount("@{Discount}");
Discount addCondition = addDiscount($productId,$customer);
insert(addCondition);
retract($c);
end
end template

下面是调用启动流口水 Kie 会话的代码

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
KieSessionConfiguration sessionConfig = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
sessionConfig.setOption( ClockTypeOption.get( ClockType.PSEUDO_CLOCK.getId() ) );
try {
loadRuleTemplate(DATA_FILE, RULE_TEMPLATE_FILE, "Discount", 2, 1);
} catch (IOException errorMsg) {
log.error(errorMsg.getMessage());       }
InternalKnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addPackages(kbuilder.getKnowledgePackages());       
KieSession kieSession =  kbase.newKieSession(sessionConfig, null);
sessionClock = ksession.getSessionClock();
ksession.insert(Customer);
ksession.fireAllRules();

但是每次,不忽略条件,即使存在客户和产品的记录,它仍然应用折扣,看起来我无法从会话中检索折扣对象。 我正在使用有状态会话。

我想您遇到的问题与规则中lock-on-active属性的使用有关。lock-on-active避免无限循环很好,但它是有代价的:在调用fireAllRules()期间,不会通过插入或修改事实来发生该规则的新激活。

您可以在这篇博文中更好地解释lock-on-active属性(以及一些避免使用它的方法(。

希望对您有所帮助,

相关内容

  • 没有找到相关文章

最新更新