gpt4 book ai didi

Drools Fusion SessionPseudoClock 未按预期工作

转载 作者:行者123 更新时间:2023-12-04 08:07:52 24 4
gpt4 key购买 nike

我正在尝试设置 KieSession在运行规则之前,日期与对象中的日期变量相同。我使用这个配置来创建我的 KieSession

KieSessionConfiguration configuration = KieServices.Factory.get().newKieSessionConfiguration();
configuration.setOption(ClockTypeOption.get("pseudo"));
在运行规则之前,我使用 advanceTime()将 session 日期设置为所需日期。
final SessionPseudoClock clock = kSession.getSessionClock();
clock.advanceTime(object.getDate().getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS);

final List<Command<?>> commands = new ArrayList<>();

commands.add(CommandFactory.newInsertElements(objects)
commands.add(CommandFactory.newInsert(object, "object"));

final ExecutionResults results = kSession.execute(CommandFactory.newBatchExecution(commands));

这导致使用滑动窗口的规则失火。假设检查 1 小时内通过的对象,而我在过去一小时内没有任何对象。我前一天只有 3 个对象。这是对象的示例数据集。
objects: [
{
clientId: "id",
date: 2021-02-09T12:00:38.249Z,
...
}
{
clientId: "id",
date: 2021-02-09T13:00:38.249Z,
...
}
{
clientId: "id",
date: 2021-02-09T14:00:38.249Z,
...
}
]
我有一个规则来检查是否有 2 个以上的对象具有相同的 clientId 1个多小时。
$object : Object($clientId : clientId)
List( size > 2 ) from collect ( Object( this before $object, clientId == $clientId ) over window:time(1h))
当我传递具有这些值的对象时。上面的规则返回 true 但我们显然没有任何对象在最后一小时内具有日期。
  { clientId: "id", date: 2021-02-10T14:00:38.249Z, ... }
我相信这是由于新配置而被破坏的,因为它以前在工作(当我没有尝试更改 session 时钟时),但我希望 session 日期等于对象日期。任何人都知道这里的问题是什么以及如何解决它?

最佳答案

Roddy of the Frozen Peas发表评论,您需要操作SessionPseudoClock在您的事件的每个插入之间。我会实现一个新的 Command , 延长 InsertElementsCommand@Override它是 execute方法:

    @Override
public Collection<FactHandle> execute(Context context) {

KieSession kSession = ((RegistryContext) context).lookup(KieSession.class);
List<FactHandle> handles = new ArrayList<>();

Object workingMemory = StringUtils.isEmpty(super.getEntryPoint()) ?
kSession :
kSession.getEntryPoint(super.getEntryPoint());

SessionPseudoClock clock = kSession.getSessionClock();

super.objects.forEach(event -> {
clock.advanceTime(((YourObject) event).getDate().getTime() - clock.getCurrentTime(), TimeUnit.MILLISECONDS);
handles.add(((EntryPoint) workingMemory).insert(event));
});

...

return handles;
}
而不是:
commands.add(CommandFactory.newInsertElements(objects));
ID:
commands.add(new YourInsertElementsCommand(objects));

关于Drools Fusion SessionPseudoClock 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66135292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com