第 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