🍃快速开始(MongoDB)
版本支持:v2.16.1+
必须是副本集或分片集群
MongoDB后端用多文档事务来原子发布规则,读取Manifest和序号基线时也用快照事务,所以整个后端都要求副本集或者分片集群,standalone的MongoDB不支持。
# Step 1:引入依赖
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring-boot-starter</artifactId>
<version>2.16.1</version>
</dependency>
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-rule-db-mongodb</artifactId>
<version>2.16.1</version>
</dependency>
# Step 2:写配置
这里要定两件事:插件用哪个客户端连Mongo,以及规则记在哪个隔离名下。两者没有关联。
先说连接。容器里有MongoClient时,连接不用配,插件按类型取出来直接用,连接池、鉴权、读写关注都沿用它。数据库名默认是liteflow,要改才配:
liteflow.rule-db.mongodb.database=liteflow
有多个MongoClient时,用mongo-client-bean-name指明用哪个。
容器里确实没有MongoClient(比如不是Spring Data的项目),那就配URI让插件自己建,这种情况下客户端归插件所有,由它负责关闭:
liteflow.rule-db.mongodb.uri=mongodb://127.0.0.1:27017/?replicaSet=rs0
顺序上bean优先于uri,找到了bean就不会再看uri;两个都没有则启动报错。
再说隔离名。liteflow.rule-db.application-name会写进各文档的applicationName字段,同一个库里不同取值的规则互相看不到。它只管隔离,和用哪个客户端无关。
Spring Boot下它留空时会取spring.application.name:
spring.application.name=your-app
两个都没配会回落成default,多个应用共用一个库时请确保取值不同。Solon插件没有这个回落,需要显式配liteflow.rule-db.application-name。这个值还要和Step 3里Publisher的applicationName(...)一致。
Collection和索引不用手工建,由Publisher初始化,具体见下一步的说明。
# Step 3:发布第一条规则
规则的增删改都走Publisher API,不用手写查询。版本自增、md5重算、sequence和变更日志,框架会在一个多文档事务里做完。
import com.yomahub.liteflow.publisher.PublishChainRequest;
import com.yomahub.liteflow.publisher.RulePublisher;
import com.yomahub.liteflow.publisher.RulePublisherFactory;
import com.yomahub.liteflow.repository.mongodb.MongoPublisherConfig;
try (RulePublisher publisher = RulePublisherFactory.create(
MongoPublisherConfig.builder()
.applicationName("your-app")
.uri("mongodb://127.0.0.1:27017/?replicaSet=rs0")
.database("liteflow")
.build())) {
publisher.publishChain(PublishChainRequest.builder()
.chainId("orderChain").el("THEN(a, b)").build());
}
索引由Publisher初始化
Manifest和变更轮询要用到的索引由Publisher在初始化时建立,包括lf_chain.applicationName、lf_script.applicationName,以及唯一复合索引lf_change_log(applicationName, seq)。
执行侧的Provider为了支持最小权限账号,启动时不会创建Collection和索引。所以如果你只部署执行节点,得先跑一次Publisher做初始化,或者让DBA把这些索引预先建好。
# Step 4:执行
和SQL一样,照常调flowExecutor.execute2Resp(...)。



