Правила слюни вставляют новый факт и запускают другие правила динамически
Я новичок в слюни и ки-сервер. У меня возникла проблема с тем, как вставить новые факты в рабочую память с помощью правила RHS(затем действия), а затем активировать другие правила с помощью этих динамически внедряемых фактов.
Я ожидаю, что когда BaseFeature вставит в рабочую память извне и активирует RuleOne, внутри RuleOne "затем" будет вставлен новый факт RuleResult, и ожидается, что он активирует RuleTwo, но он не активирует RuleTwo, только RuleOne был активирован, это что-то я делаю не так?
Здесь у меня есть два правила и набор фактов:
ФАКТЫ Определение:
public class AppResult implements java.io.Serializable
{
static final long serialVersionUID = 1L;
private java.lang.String key;
private java.lang.String value;
//getters and setters ...
}
public class BaseFeature implements java.io.Serializable
{
static final long serialVersionUID = 1L;
private int age;
//getters and setters ...
}
public class RuleResult implements java.io.Serializable
{
static final long serialVersionUID = 1L;
private java.lang.String ruleName;
private java.lang.Long score;
private boolean state;
//getters and setters ...
}
Определение правила:
rule "RuleOne"
dialect "mvel"
salience 100
no-loop true
lock-on-active true
when
$b : BaseFeature( age < 22 || age > 40 )
then
RuleResult $r = new RuleResult();
$r.setRuleName( "RuleOne" );
$r.setState( false );
insertLogical( $r );
end
rule "RuleTwo"
dialect "mvel"
no-loop false
lock-on-active true
salience 10
when
$r : RuleResult( ruleName == "RuleOne" , state == false )
$a : AppResult( )
then
$a.setKey( "PASS" );
$a.setValue( "false" );
end
как добиться того, чтобы правила запускали новые факты и запускали другие правила динамически? заранее спасибо!
Я использую kie-server(6.5 Final) для тестирования, а также POST и Reponse, как показано ниже:
СООБЩЕНИЕ:
{
"lookup": "RuleChainTestStateless",
"commands": [
{
"insert": {
"return-object": false,
"object": {
"com.qf.rulechaintest.BaseFeature": {
"age": "10"
}
}
}
},
{
"insert": {
"return-object": true,
"out-identifier": "AppResult",
"object": {
"com.qf.rulechaintest.AppResult": {
}
}
}
},
{
"fire-all-rules": ""
},
{
"get-objects":{
"out-identifier":"allFactsInWrokingMemory"
}
}
]
}
réponse:
{
"type": "SUCCESS",
"msg": "Container RuleChainTest1.1 successfully called.",
"result": {
"execution-results": {
"results": [
{
"key": "",
"value": 1
},
{
"key": "AppResult",
"value": {
"com.qf.rulechaintest.AppResult": {
"key": null,
"value": null
}
}
},
{
"key": "allFactsInWrokingMemory",
"value": [
{
"com.qf.rulechaintest.BaseFeature": {
"age": 10
}
},
{
"com.qf.rulechaintest.AppResult": {
"key": null,
"value": null
}
},
{
"com.qf.rulechaintest.RuleResult": {
"ruleName": "RuleOne",
"score": null,
"state": false
}
}
]
}
],
"facts": [
{
"key": "AppResult",
"value": {
"org.drools.core.common.DefaultFactHandle": {
"external-form": "0:2:1542374590:1542374590:2:DEFAULT:NON_TRAIT:com.qf.rulechaintest.AppResult"
}
}
}
]
}
}
}
Обратите внимание, что ответ:
"com.qf.rulechaintest.AppResult": {
"key": null,
"value": null
}
что это должно быть:
"com.qf.rulechaintest.AppResult": {
"key": "PASS",
"value": "false"
}
3 ответа
Попробуйте использовать функцию обновления "
затем
RuleResult $r = new RuleResult();
$r.setRuleName( "RuleOne" );
$r.setState( false );
update ( $r );
"
Если вы не знаете назначение этих атрибутов правила, вам следует прочитать документацию. Тогда, я думаю, вы поймете, что можете их удалить.
salience 100 or 10
no-loop true or false
lock-on-active true
Я согласен с laune, что вам следует прочитать, что означают атрибуты правила (см. Здесь в документации [1]). Я думаю, это потому, что у вас есть активная блокировка по правилам. Пожалуйста, посмотрите документы, которые я связал.
[1] https://docs.jboss.org/drools/release/6.5.0.Final/drools-docs/html/ch08.html