{"id":20432170,"url":"https://github.com/davidfantasy/fast-rule","last_synced_at":"2025-09-24T11:31:31.088Z","repository":{"id":248515451,"uuid":"828904479","full_name":"davidfantasy/fast-rule","owner":"davidfantasy","description":"一个轻量级的高性能规则引擎，适用于物联网等高并发场景","archived":false,"fork":false,"pushed_at":"2024-12-11T08:26:13.000Z","size":44,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-06T14:21:52.034Z","etag":null,"topics":["high-performance","iot","rule","ruleengine"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/davidfantasy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-15T11:09:24.000Z","updated_at":"2025-03-26T18:19:28.000Z","dependencies_parsed_at":"2025-01-15T18:08:09.792Z","dependency_job_id":"37e59e4a-a6d0-497a-af3b-9945955a9797","html_url":"https://github.com/davidfantasy/fast-rule","commit_stats":null,"previous_names":["davidfantasy/fast-rule"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/davidfantasy/fast-rule","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidfantasy%2Ffast-rule","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidfantasy%2Ffast-rule/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidfantasy%2Ffast-rule/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidfantasy%2Ffast-rule/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/davidfantasy","download_url":"https://codeload.github.com/davidfantasy/fast-rule/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidfantasy%2Ffast-rule/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276738878,"owners_count":25696014,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-24T02:00:09.776Z","response_time":97,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["high-performance","iot","rule","ruleengine"],"created_at":"2024-11-15T08:14:04.842Z","updated_at":"2025-09-24T11:31:30.783Z","avatar_url":"https://github.com/davidfantasy.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# fast-rule\n\nfast-rule是一款高性能的轻量级规则引擎，主要用于物联网等高并发领域。它功能简单易用，没有很多的复杂概念，但留出了足够的扩展点方便用户根据业务场景进行扩展。规则执行上采用**全异步设计**，且同时支持 **“PUSH”** 和 **“PULL”** 两种规则触发模式，性能足够能打。\n\n# 设计方案\nfast-rule的设计思路可以参考我写的这篇文章：\n\n[从0到1手搓一个规则引擎（1）](https://mp.weixin.qq.com/s/yM8fjKokCnBo2zsFYsHokQ)\n\n[从0到1手搓一个规则引擎（2）](https://mp.weixin.qq.com/s/GmDIZz3EUFM-eL17fY5ukQ)\n\n# 快速开始\n\n## 引入依赖：\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.davidfantasy\u003c/groupId\u003e\n    \u003cartifactId\u003efast-rule\u003c/artifactId\u003e\n    \u003cversion\u003e1.1.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n## 简单示例\n\n~~~java\n//初始化规则引擎\nRuleManager ruleManager = new DefaultRuleManager();\nRuleEngine ruleEngine = new DefaultRuleEngine(ruleManager, RulesEngineConfig.builder().build());\nruleEngine.start();\n//添加规则\nruleManager.add(new BaseRule(\"1\", \"rule1\", 1, null, fact -\u003e {\n    int v = Integer.parseInt(fact.getValue(\"v\").toString());\n    return v \u003e 5 \u0026\u0026 v \u003c 10;\n}) {\n    @Override\n    public void executeThen(Fact fact) {\n        System.out.println(\"hit rule:\" + fact.getId());\n    }\n});\n//异步触发规则\nruleEngine.fire(new SimpleFact(\"1\", \"v\", 7, System.currentTimeMillis()), false);\n//关闭规则引擎\nruleEngine.shutdown();\n~~~\n更多的使用方式可以参考测试用例中的样本代码\n\n## 配置\n可通过RulesEngineConfig指定配置了多个规则时，规则引擎的匹配模式\n~~~java\n/**\n * 当fact已触发第一个规则后，是否跳过对后续的规则的匹配，仅当启用规则优先级匹配时生效\n */\nprivate boolean skipOnFirstAppliedRule;\n/**\n * 当fact没有触发第一个规则时，是否跳过对后续的规则的匹配，仅当启用规则优先级匹配时生效\n */\nprivate boolean skipOnFirstNonAppliedRule;\n/**\n * 当fact触发第一个规则执行发生异常时，是否跳过后续的规则，仅当启用规则优先级匹配时生效\n */\nprivate boolean skipOnFirstFailedRule;\n~~~\n\n## 单次触发和延迟触发\n框架提供了DelayStatefulTriggerRule，用于支持规则的单次触发模式和延迟触发模式，相关说明如下：\n~~~java\n/**\n * 有状态的规则，会保存规则的触发状态，触发中的规则不会被再次触发，直到某个fact不再满足规则条件重置规则的触发状态；\n * 举例：\n * rule1 当 fact a\u003e5 时触发执行\n * 当规则引擎收到 5个采集的a的值时：\n * a=1 不满足，不会执行rule1\n * a=6 满足，执行rule1\n * a=8 满足，但不会执行rule1，因为前面已经触发过了\n * a=4 不满足，不会执行rule1，但会重置规则的执行状态\n * a=7 满足，执行rule1\n * 同时支持fact对规则的延迟触发，举例：\n * rule1 当 fact a\u003e5 时触发执行，triggerDelayMS设置5000\n * 当规则引擎收到 4个采集的a的值时：\n * a=1 不满足，不会执行rule1\n * a=6 满足，加入到等待触发队列\n * a=8 满足，但a=6已加入等待触发队列，忽略该值\n * a=7 满足，但a=6已加入等待触发队列，忽略该值\n * 等待5000ms后，以a=6触发rule1的执行\n * 如果在5000ms内：\n * a=4 不满足，删除等待队列中a的值，到期后不会再执行\n **/\npublic abstract class DelayStatefulTriggerRule extends BaseRule {\n    ......\n}\n~~~\n\n## 脚本规则\n目前支持基于Janino框架的表达式及脚本规则，使用方式如下：\n~~~java\nSimpleFact fact = new SimpleFact(\"fact1\", \"param\", 20, null);\nMap\u003cString, Integer\u003e resultMap = new HashMap\u003c\u003e();\nfact.addValue(\"result\", resultMap);\n//规则的处理逻辑脚本\nString executeScript = \"result.put(\\\"number\\\", param*20);\";\n//规则的条件逻辑表达式\nString conditionExpr = \"param \u003e 10\";\nCondition condition = new JaninoCondition(conditionExpr, new String[]{\"param\"}, new Class[]{Integer.class});\nJaninoRule rule = new JaninoRule(\"rule1\", \"rule1\", 1, \"rule1\", condition, executeScript, new String[]{\"param\", \"result\"}, new Class[]{Integer.class, Map.class});\nruleManager.add(rule);\nruleEngine.fire(fact, false);\nThread.sleep(100);\nAssertions.assertEquals(400, resultMap.get(\"number\"));\n~~~\n\n# 交流联系\n\n使用上有问题请优先看一下单元测试中的例子，如果还不能解决请给我提issue，我会尽快处理。\n\n也欢迎大家关注我的公众号（飞空之羽的技术手札），我会在上面定期分享一些关于技术的经验和感悟~\n\n![二维码](https://github.com/davidfantasy/mybatis-plus-generator-ui/blob/master/imgs/wechat.jpg)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidfantasy%2Ffast-rule","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdavidfantasy%2Ffast-rule","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidfantasy%2Ffast-rule/lists"}