最近公司准备启动一个风险系统【Springboot + urule 】

Springboot 集成 urule

最近公司准备启动一个风险系统, 架构中用到 urule 与 flowable, 捣鼓了好几天, 踩了很多坑, 算是初步写出一个 demo, 顺手记录一下

Urule2

URule 是一款基于 RETE 算法纯 Java 的开源规则引擎产品,提供了向导式规则集、脚本式规则集、决策表、决策树、评分卡及决策流共六种类型的规则定义方式,配合基于 WEB 的设计器,可快速实现规则的定义、维护与发布。用来替换原有的 drools 规则引擎, 有一部分原因是因为 URule 自带了配置规则的 UI 界面 本例中采用 urule 客户端与服务端分离的设计

Urule Server

urule 的 Server 端, 用来配置规则 (知识包), 并暴露给客户端, 本例中知识库存储在 mysql 数据库中 springboot 的配置可以详见 URule 官方文档

http://wiki.bsdn.org/display/urule2/

1. 配置 Urule Servlet

URuleServletRegistration.java

@Component
public class URuleServletRegistration {
    @Bean
    public ServletRegistrationBean registerURuleServlet(){
        return new ServletRegistrationBean(new URuleServlet(),"/urule/*");
    }
}

2. 配置 urule 知识库数据源、导入配置文件

application.yml

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/world?useUnicode=true&characterEncoding=utf-8
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 1234
  jackson:
    default-property-inclusion: non_null

urule:
  repository:
    databasetype: mysql
    datasourcename: datasource

server:
  port: 8787

Config.java

@Configuration
@ImportResource({"classpath:urule-console-context.xml"})
@PropertySource(value = {"classpath:urule-console-context.properties"})
public class Config {
    @Bean
    public PropertySourcesPlaceholderConfigurer propertySourceLoader() {
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        configurer.setIgnoreUnresolvablePlaceholders(true);
        configurer.setOrder(1);
        return configurer;
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource datasource() {
        return DataSourceBuilder.create().build();
    }
}

3. 启动 Application 类

Application.java

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

访问地址:http://localhost:8787/urule/frame 即可看到 urule 的规则配置页面

77d8236741adf5bf1634cd33d31c2110.png


Urule Client

Urule 的客户端, 即调用规则的一方

1. 配置 urule 知识库地址

application.yml

urule:
  resporityServerUrl: http://localhost:8787
  knowledgeUpdateCycle: 1

server:
  port: 7878

2. 引入 urule 配置文件

RuleConfig.java

@Configuration
@ImportResource({"classpath:urule-core-context.xml"})
public class RuleConfig {
    @Bean
    public PropertySourcesPlaceholderConfigurer propertySourceLoader() {
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        configurer.setIgnoreUnresolvablePlaceholders(true);
        configurer.setOrder(1);
        return configurer;
    }
}

3. 配置 KnowledgePackageReceiverServlet

此 Servlet 用于接收 Urule 服务端发布的知识包 (不想用这个功能可以不配)

URuleServletRegistration.java

@Component
public class URuleServletRegistration {
    @Bean
    public ServletRegistrationBean registerURuleServlet(){
        return new ServletRegistrationBean(new KnowledgePackageReceiverServlet(),"/knowledgepackagereceiver");
    }
}

4. 启动 Application 类

RuleApplication.java

@SpringBootApplication
public class RuleApplication {
    public static void main(String[] args) {
        SpringApplication.run(RuleApplication.class, args);
    }
}

到这里 Urule 的服务端和客户端就都配置完了。

测试规则

由于嫌官方文档的 sample 太麻烦, 这里我自己写了个简单的规则作为测试用途

1. 添加规则 & 发布

配置参数

d484a111eed51216dc66b9be44c05201.png

配置规则

大于 50 的数会乘以 10, 小于 50 的数会除以 2

71f49b40f8529ac4e9f38792811645d1.png

配置推送客户端

2a57a7a4414ae3a1bb15d3d96ea31981.png

发布知识包

bee69c7199a2ce0e1bfbb1371fba6b62.png

2. 编写 Controller 测试

RuleController.java

@RestController
public class RuleController {
    @RequestMapping("rule")
    public String rule(@RequestParam String data) throws IOException {
        //创建一个KnowledgeSession对象
        KnowledgeService knowledgeService = (KnowledgeService) Utils.getApplicationContext().getBean(KnowledgeService.BEAN_ID);
        KnowledgePackage knowledgePackage = knowledgeService.getKnowledge("aaa/bag");
        KnowledgeSession session = KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);

        Integer integer = Integer.valueOf(data);
        Map<String, Object> param = new HashMap();
        param.put("var", integer);
        session.fireRules(param);

        Integer result = (Integer) session.getParameter("var");
        return String.valueOf(result);
    }
}

访问 http://localhost:7878/rule?data=50 和 http://localhost:7878/rule?data=40可以看到页面上分别打印 500 和 20, 执行规则成功


源码地址

https://github.com/worstEzreal/urule_springboot


作者:worstezreal

来源链接:

https://blog.csdn.net/worstezreal/article/details/78968710

4bc6f52008eb1b7f70ba719af3393a4a.png

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值