摘要:
Urule决策引擎可简化开发校验、决策类代码,底层由java语言实现,可基于SpringBoot快速配置,因为Urule工具目前为非常用工具,网上关于SpringBoot整合Urule资料匮乏,一直自己摸索,简单的环境搭建也费了些功夫,遇到些坑,作此记录
本次记录主要记录Urule-Serve端Urule-Client端分开部署的模式,这种使用场景也会更多;嵌入式成一个项目的配置和Urule-Server端一致。
一、Urule-Server端:
1.1、 基于maven的SpringBoot基本环境搭建请参考SpringBoot教程
1.2、引入Urule相关依赖,urule-console-pro,开源版本可到https://search.maven.org
中心搜索,依赖如下:
org.springframework.boot
spring-boot-starter-web
com.bstek.urule
urule-console-pro
2.1.0
org.slf4j
slf4j-jdk14
javax.servlet
servlet-api
2.5
provided
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.1
com.alibaba
druid
1.0.9
mysql
mysql-connector-java
1.3、配置文件:两个,appplication.yml , application.properties
appplication.yml,配置数据库信息(我们把urule项目存到数据库中)
server:
port: 8081
spring:
application:
name: UruleServer
datasource:
name: datasource
jdbc-url: jdbc:mysql://127.0.0.1:3306/urule?useUnicode=true&characterEncoding=utf-8
username: root
password: 666666
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
注意,我这此刻DataSource下不jdbc-url而不是url。根据SpringBoot版本自行调整
application.properties,配置项目储存位置
#若为本地环境需配置此路径
#urule.repository.dir=F:/EclipsePractice/03_SpringCloud/repo4rule
#若为数据库,配置此项,两项均不配则系统指定默认地址
urule.repository.databasetype=mysql
urule.repository.datasourcename=datasource
ignore-unresolvable=true
order=1
1.4、初始化bean
datesource
@Configuration
public class configuration {
@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();
}
}
serverlet
@Component
public class URuleServletRegistration
{
@Bean
public ServletRegistrationBean registerURuleServlet()
{
return new ServletRegistrationBean(new URuleServlet(), new String[] { "/urule/*" });
}
}
1.5、启动类:
@SpringBootApplication
@ImportResource({"classpath:urule-console-context.xml"})
public class Application
{
public static void main(String[] args)
{
SpringApplication.run(Application.class, args);
}
}
二、客户端调用:
2.1、配置类
application.yml
server:
port: 8090
spring:
application:
name: UruleClient
datasource:
name: datasource
url: jdbc:mysql://127.0.0.1:3306/myland?useUnicode=true&characterEncoding=utf-8
username: root
password: 666666
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
urule:
###服务端发现地址
resporityServerUrl: http://localhost:8081
###knowledgeUpdateCycle为0时,不是检查缓存,每次都从服务端拉取,为1时,会先查找缓存
knowledgeUpdateCycle: 1
2.2、初始化bean
@Configuration
public class RuleConfig {
@Bean
public PropertySourcesPlaceholderConfigurer propertySourceLoader() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setIgnoreUnresolvablePlaceholders(true);
configurer.setOrder(1);
return configurer;
}
}
@Component
public class URuleServletRegistration {
//此Servlet用于接收Urule服务端发布的知识包,使用开源版本时删除或者注释这个bean
@Bean
public ServletRegistrationBean registerURuleServlet(){
return new ServletRegistrationBean(new KnowledgePackageReceiverServlet(),"/knowledgepackagereceiver");
}
}
2.3、controller:
@RestController
public class TestController {
@RequestMapping("/rule")
public String getRara(@RequestParam String data)throws IOException{
KnowledgeService knowledgeService = (KnowledgeService) Utils.getApplicationContext().getBean(KnowledgeService.BEAN_ID);
//参数,Urule项目名/知识包名
KnowledgePackage knowledgePackage = knowledgeService.getKnowledge("letasa/pare");
KnowledgeSession session = KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);
Integer integer = Integer.valueOf(data);
Map param = new HashMap();
//参数,var,传入参数,和参数库中定义一致
param.put("var", integer);
session.fireRules(param);
//result,返回参数,和参数库中定义一致
Integer result = (Integer) session.getParameter("result");
return String.valueOf(result);
}
}
2.4、启动类
@SpringBootApplication
@ImportResource({"classpath:urule-core-context.xml"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Urule项目配置
注:Rrule-pro版本支持将知识包推送给具体客户端,客户端使用时先调用缓存,如无缓存则再到服务端拉去。但开源版本的Urule不支持推送,客户端只能主动到服务端拉去数据。
最后访问客户端:http://localhost:8090/rule?data=67,或者data=25,分别得到100,20.
success!