2015-09-21 2 views
0

В настоящее время мой файл drl выглядит примерно так, как это, с более чем 100 правилами.случайный старт в drools

rule "check 0" 
when 
    ..... 
then 
.......... 
end 


rule "check 1" 
when 
    ..... 
then 
.......... 
end 

rule "check 2" 
when 
    ..... 
then 
.......... 
end 

. 
. 
. 
. 

rule "check 100" 
when 
    ..... 
then 
.......... 
end 

и я поставил sessionObject.fireAllRules(1);

Так что это в основном перебора всех правил от rule 'check 0' до rule 'check 100' и возвращается, когда все это подпадает под некоторым правилом.

Это их способ, когда я могу начать с некоторого случайного правила, а не начинать rule 'check 0' каждый раз.

Я ищу что-то вроде этого.

Начиная с rule 'check 34' итерации до rule 'check 100' и итерации от правила 'check 0' до rule 'check 33'.

ответ

1

Идея тестирования состояния и выполнения действия, если оно истинна, так же стара, как компьютеры. Аналогично, концепция упорядочивающих действий так же стара. Оба они были реализованы в различных версиях того, что теперь называется «процедурным программированием».

Требования, которые вы описываете, встречаются и выполняются «процедурным программированием».

Конечно, Drools может вести себя как процедурная программа. Итак, чтобы ответить на ваш вопрос: Да, это возможно, используя значительность.

rule "to be fired first" 
salience 999999999 
when ... then ... end 

Просто используйте уменьшающиеся значения, и это определяет порядок.

Редактировать Идея о случайном запуске правила не входит в парадигму программирования на основе правил. Но вы можете имитировать это (почему бы вам не использовать процедурное программирование?), Выведя значимость из атрибута факта.

Создать 100 объектов класса Оценка с полях int order и int rank. Вставьте их с order, установленными в 1..100 и rank, в случайную перестановку 1..100.

rule "number 49" 
salience $rank 
when 
    Ranking(order == 49, $rank: rank) 
    ... 
then ... end 

Для следующего запуска просто используйте другую перестановку. Правило, которому повезло поймать Ранжирование с rank==100, будет стрелять первым.

+0

Да, я знаю это :) Но вопрос в том, как рандомизировать его. В первом запуске можно сказать, что он начинается с правила 34. Во втором запуске он может начинаться с любого другого правила, такого как правило 45. Это возможно. – starkk92

+0

@ starkk92 Отредактировано, чтобы включить способ рандомизации приоритета правила. – laune