第 19 章 HA CEP 客户端和服务器代码的要求


在为高可用性 CEP 开发客户端和服务器代码时,请遵循某些额外的要求。

kie-remote API

客户端代码必须使用 kie-remote API,而不是 kie API。kie-remote API 在 org.kie:kie-remote Maven 工件中指定。您可以在 kie-remote Maven 模块中找到源代码。

显式时间戳

决策引擎需要确定发生事件的顺序。因此,每个事件都必须为其分配一个关联的时间戳。在高可用性环境中,使此时间戳成为对事件建模的 JavaBean 的属性。使用 @Timestamp 注释注解事件类,其中 timestamp 属性本身的名称是参数,如下例所示:

@Role(Role.Type.EVENT)
@Timestamp("myTime")
public class StockTickEvent implements Serializable {

    private String company;
    private double price;
    private long myTime;
}

如果没有提供 timestamp 属性,Drools 根据客户端将事件插入到远程会话时,为每个事件分配一个时间戳。但是,这种机制取决于客户端机器上的时钟。如果不同客户端间的时钟分离,则这些主机插入的事件之间可能会出现不一致的情况。

非内存操作的 Lambda 表达式

必须在集群的每个节点中处理工作内存操作(用于插入、修改或删除决策引擎工作内存中的信息)。不是内存操作的操作必须只在领导执行。

例如,代码可能包括以下规则:

rule FindAdult when
  $p : Person(age >= 18)
then
  modify($p) { setAdult(true) }; // working memory action
  sendEmailTo($p); // side effect
end

触发此规则后,每个节点上都必须将人标记为 adult。但是,只有领导必须发送电子邮件,以便仅发送一封电子邮件副本。

因此,在您的代码中,将电子邮件操作(称为 副作用)嵌套在 lambda 表达式中,如下例所示:

rule FindAdult when
  $p : Person(age >= 18)
then
  modify($p) { setAdult(true) };
  DroolsExecutor.getInstance().execute( () -> sendEmailTo($p) );
end
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.