Код: Выделить всё
rule "WIN_DRL"
when
$featureMap: Map()
$reward: Reward()
$rewardSummery : RewardSummery(
$milestoneId: milestoneId,
additionalParam["eventSource"] == $reward.getEventSource(),
"SUPER_AMOUNT_MONTHLY_SUM" == aggregationsDrl
)
$container: WinningRuleResultContainer()
then
System.out.println( "in then condition");
WinningRuleResult result = new WinningRuleResult($milestoneId, "" );
$container.addResult(result);
end
Правило не подходит для реальных случаев использования в большом масштабе (5000 событий в минуту).
Я кэшировал kieContainerSessionsPool в памяти своих модулей.
Во время выполнения: -
- Получить новый KieSession из этих контейнеров
- Вставить все объекты в контейнер
- fireAllRules
Код: Выделить всё
@Singleton
@Log4j2
public class RuleEngineServiceImpl implements RuleEngineService {
Map kieContainersPoolMap = new ConcurrentHashMap();
public void executeRules(String shaKey, List objects){
KieContainerSessionsPool kieContainerPool = this.kieContainersPoolMap.get(shaKey);
long startTime = CommonUtil.getCurrentEpoch() ;
log.info("KieSession for shaKey: {}, startTime: {}", shaKey, startTime);
KieSession kSession = null;
Reward rewardObject = null ;
WinningRuleResultContainer winningRuleResultContainer = null ;
synchronized(RuleEngineServiceImpl.class) {
kSession = kieContainerPool.newKieSession();
long identifier = kSession.getIdentifier();
}
if(Objects.isNull(kSession)){
log.info("KieSession is null, shaKey: {}", shaKey);
}
// insert all the data object to drools.
for (Object ob : objects) {
kSession.insert(ob);
}
// Fire all rules
int fireRulesResult = 0;
int retryCount = 0;
while(fireRulesResult==0 && retryCount
Подробнее здесь: [url]https://stackoverflow.com/questions/79828471/drools-rule-fails-for-genuine-use-case-at-high-scale[/url]
Мобильная версия