如何在运行时在 drools 中插入事实以在规则之间共享?
how to insert facts in drools at runtime to share between rules?
我有一个简单的检查数据库中是否存在用户 ID
rule "check if user is already present"
agenda-group "dbcheck"
when
$blackListUserDto : BlackListUserDto( )
eval( BlackListServiceImpl.isUserBlacklisted($blackListUserDto) )
then
System.out.println("to be executed first");
System.out.println($blackListUserDto.isUserAlreadyBlacklisted());
end
方法isUserBlacklisted如下
public static boolean isUserBlacklisted(BlackListUserDto blackListUserDto)
{
try {
BlackListEntity blackListEntity = blackListRepository.findByUserId(blackListUserDto.getUserId());
if(blackListEntity!=null)
{
blackListUserDto.setUserAlreadyBlacklisted(true);
}
else
//do something else
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
可以看出,我正在通过 setUserAlreadyBlacklisted(true) 修改 fact(dto) blackListUserDto。
But in the "then" part of rule when I am printing the value
System.out.println($blackListUserDto.isUserAlreadyBlacklisted()); The
output is still false.
我还需要在另一个规则中共享此数据,如下所示
rule "blacklist user"
agenda-group "blacklist"
when
(BlackListUserDto( userAlreadyBlacklisted == false ))
then
//do something else
end
到目前为止我的理解是当我编辑事实时我们需要重新插入它们吗?如果是,那么我如何将它插入同一个会话中,因为我正在使用另一种方法创建此会话,如下所示:-
public void blacklistUser(String userId) throws IOException
{
BlackListUserDto blackListUserDto=new BlackListUserDto();
blackListUserDto.setUserId(userId);
KieSession kieSession = kContainer.newKieSession();
Agenda agenda = kieSession.getAgenda();
agenda.getAgendaGroup( "blacklist" ).setFocus();
agenda.getAgendaGroup( "dbcheck" ).setFocus();
kieSession.insert(blackListUserDto);
kieSession.insert(queryTypeDto);
kieSession.fireAllRules();
kieSession.dispose();
}
要进行哪些更改以确保事实得到更新并且更新后的值反映在下一条规则中。
我找到了上述问题的解决方案,我正在分享解决上述用例的规则
rule "check if user is already blacklisted 1"
agenda-group "dbcheck"
when
(QueryTypeDto( queryType == "blacklist" ))
$blackListUser : BlackListUserDto( )
not ControlFact( blackListUserDto == $blackListUser )
$blackListUserDto : BlackListUserDto( )
eval( BlackListServiceImpl.isUserBlacklisted($blackListUser) == false )
$queryTypeDto : QueryTypeDto()
then
System.out.println("to be executed first");
System.out.println($blackListUser.isBlackListFraudUser());
modify($blackListUser){
setBlackListFraudUser(true)
}
insert (new ControlFact($blackListUser));
//$queryTypeDto.setUserBlackListed(false);
end
此博客将有助于更多地了解 modify 在 drools 中的使用:https://ilesteban.wordpress.com/2012/11/16/about-drools-and-infinite-execution-loops/
我有一个简单的检查数据库中是否存在用户 ID
rule "check if user is already present"
agenda-group "dbcheck"
when
$blackListUserDto : BlackListUserDto( )
eval( BlackListServiceImpl.isUserBlacklisted($blackListUserDto) )
then
System.out.println("to be executed first");
System.out.println($blackListUserDto.isUserAlreadyBlacklisted());
end
方法isUserBlacklisted如下
public static boolean isUserBlacklisted(BlackListUserDto blackListUserDto)
{
try {
BlackListEntity blackListEntity = blackListRepository.findByUserId(blackListUserDto.getUserId());
if(blackListEntity!=null)
{
blackListUserDto.setUserAlreadyBlacklisted(true);
}
else
//do something else
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
可以看出,我正在通过 setUserAlreadyBlacklisted(true) 修改 fact(dto) blackListUserDto。
But in the "then" part of rule when I am printing the value
System.out.println($blackListUserDto.isUserAlreadyBlacklisted()); The output is still false.
我还需要在另一个规则中共享此数据,如下所示
rule "blacklist user"
agenda-group "blacklist"
when
(BlackListUserDto( userAlreadyBlacklisted == false ))
then
//do something else
end
到目前为止我的理解是当我编辑事实时我们需要重新插入它们吗?如果是,那么我如何将它插入同一个会话中,因为我正在使用另一种方法创建此会话,如下所示:-
public void blacklistUser(String userId) throws IOException
{
BlackListUserDto blackListUserDto=new BlackListUserDto();
blackListUserDto.setUserId(userId);
KieSession kieSession = kContainer.newKieSession();
Agenda agenda = kieSession.getAgenda();
agenda.getAgendaGroup( "blacklist" ).setFocus();
agenda.getAgendaGroup( "dbcheck" ).setFocus();
kieSession.insert(blackListUserDto);
kieSession.insert(queryTypeDto);
kieSession.fireAllRules();
kieSession.dispose();
}
要进行哪些更改以确保事实得到更新并且更新后的值反映在下一条规则中。
我找到了上述问题的解决方案,我正在分享解决上述用例的规则
rule "check if user is already blacklisted 1"
agenda-group "dbcheck"
when
(QueryTypeDto( queryType == "blacklist" ))
$blackListUser : BlackListUserDto( )
not ControlFact( blackListUserDto == $blackListUser )
$blackListUserDto : BlackListUserDto( )
eval( BlackListServiceImpl.isUserBlacklisted($blackListUser) == false )
$queryTypeDto : QueryTypeDto()
then
System.out.println("to be executed first");
System.out.println($blackListUser.isBlackListFraudUser());
modify($blackListUser){
setBlackListFraudUser(true)
}
insert (new ControlFact($blackListUser));
//$queryTypeDto.setUserBlackListed(false);
end
此博客将有助于更多地了解 modify 在 drools 中的使用:https://ilesteban.wordpress.com/2012/11/16/about-drools-and-infinite-execution-loops/