Springboot集成urule

Springboot集成urule

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


Urule2

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

Urule Server

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

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的规则配置页面

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.添加规则&发布
配置参数

配置规则

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

配置推送客户端

发布知识包

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=50http://localhost:7878/rule?data=40
可以看到页面上分别打印500和20,执行规则成功


源码地址

https://github.com/worstEzreal/urule_springboot

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
springboot集成URule可以通过对开源版进行二次开发实现。在集成之前,需要创建一个空数据库,并在edas-rule-server服务中修改数据库的配置。配置文件如下所示: ```properties spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/urule-data?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false spring.datasource.username=root spring.datasource.password=mysql ``` 在启动服务时,会自动创建表结构。接下来,可以创建一个Servlet用于接收URule服务端发布的知识包。这一步是可选的,如果不需要使用此功能,可以不进行配置。示例代码如下: ```java @Component public class URuleServletRegistration { @Bean public ServletRegistrationBean registerURuleServlet(){ return new ServletRegistrationBean(new KnowledgePackageReceiverServlet(),"/knowledgepackagereceiver"); } } ``` 最后,在Application类中启动URule服务。示例代码如下: ```java @SpringBootApplication public class RuleApplication { public static void main(String[] args) { SpringApplication.run(RuleApplication.class, args); } } ``` 通过以上步骤,就可以实现springboot集成URule的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [SpringBoot + 规则引擎 URule,太强了!](https://blog.csdn.net/LINgZone2/article/details/130804316)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Springboot集成urule](https://blog.csdn.net/worstezreal/article/details/78968710)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值