Слюни правило начинает стрелять во время стресс-тестов
У нас есть правило, которое должно срабатывать, когда у клиента есть определенный код продукта, и изначально мы указали это правило следующим образом:
rule "DENTAL"
when
$bill : Bill ( $client : Client != null )
Client ( (productCode/1000) >= 102 && (productCode/1000) < 103 ) from $client
then
$bill.add(13300);
end
Во время стресс-тестирования мы отправляли код продукта, который попадает в диапазон 101. Правило срабатывало не так, как ожидалось, пока в определенный момент оно не начало снова и снова. Журналы (= System.out в "тогда") ясно указывали, что рассчитанный (productCode/1000) productCode был 101.
Мы изменили правило на:
rule "DENTAL"
when
$bill : Bill ( $client : Client != null )
Client ( productCode >= 102000 && productCode < 103000 ) from $client
then
$bill.add(13300);
end
Что кажется лучшим определением правила в целом, и, как и ожидалось, правило перестало срабатывать во время стресс-тестов.
Возможно, первое правило является примером плохого кодирования, и мы не должны применять разделение внутри правила по определенной причине, но я ищу подтверждение этому. Возможно, это связано с Mvel. Может быть, кто-то может пролить свет.
Некоторые подробности о структуре:
- Правило оценивается только в сеансах без сохранения состояния
- В сеансы без сохранения состояния вставляется только один объект Bill
- Каждый счет имеет только одного клиента
- Одно из предположений заключается в том, что атрибут productCode всегда имеет 6 цифр (в первом определении 0 productCode вызовет ошибку).
- KIE / Drools версия 6.5.0
- Проект скомпилирован с JDK6 и работает на IBM WAS7.
- Объект KieBase создается один раз, а затем извлекается из кэша IBM.
Мы собираемся перейти на WildFly и JDK8, и поэтому локальное тестирование JMeter было выполнено на WildFly 10.1.x с JDK8 и кешем Java. С этими настройками у нас не возникло никаких проблем с правилом.
Заранее благодарю за любую помощь.