核心pom.xml 文件:

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.1.1.RELEASE</version>

</parent>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>1.8</java.version>

<mybatis-spring-boot-starter.version>1.3.2</mybatis-spring-boot-starter.version>

<mysql-connector-java.version>8.0.11</mysql-connector-java.version>

<com.alibaba.druid.version>1.1.9</com.alibaba.druid.version>

<commons-lang.version>2.6</commons-lang.version>

<commons-codec.version>1.10</commons-codec.version>

<commons-lang3.version>3.8.1</commons-lang3.version>

<commons-net.version>3.6</commons-net.version>

<commons-io.version>2.6</commons-io.version>

<commons-collections.version>3.2.1</commons-collections.version>

<common-fileupload.version>1.3.1</common-fileupload.version>

<fastjson.version>1.2.48</fastjson.version>

<jasperreports.version>6.10.0</jasperreports.version>

</properties>

<dependencies>

<!-- SpringWeb模块 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<!--springboot 集成测试框架 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

<!--lombok插件 -->

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<version>${lombok.version}</version>

<scope>provided</scope>

</dependency>

<!-- mysql 连接 -->

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

<version>${mybatis-spring-boot-starter.version}</version>

</dependency>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>${mysql-connector-java.version}</version>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid-spring-boot-starter</artifactId>

<version>${com.alibaba.druid.version}</version>

</dependency>

<!-- 分页控件 -->

<dependency>

<groupId>com.github.pagehelper</groupId>

<artifactId>pagehelper</artifactId>

<version>4.1.6</version>

</dependency>

<!--common-lang 常用工具包 -->

<dependency>

<groupId>commons-lang</groupId>

<artifactId>commons-lang</artifactId>

<version>${commons-lang.version}</version>

</dependency>

<!--commons-lang3 工具包 -->

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-lang3</artifactId>

<version>${commons-lang3.version}</version>

</dependency>

<!--commons-codec 加密工具包 -->

<dependency>

<groupId>commons-codec</groupId>

<artifactId>commons-codec</artifactId>

<version>${commons-codec.version}</version>

</dependency>

<!--commons-net 网络工具包 -->

<dependency>

<groupId>commons-net</groupId>

<artifactId>commons-net</artifactId>

<version>${commons-net.version}</version>

</dependency>

<!--common-io 工具包 -->

<dependency>

<groupId>commons-io</groupId>

<artifactId>commons-io</artifactId>

<version>${commons-io.version}</version>

</dependency>

<!--common-collection 工具包 -->

<dependency>

<groupId>commons-collections</groupId>

<artifactId>commons-collections</artifactId>

<version>${commons-collections.version}</version>

</dependency>

<!--common-fileupload 工具包 -->

<dependency>

<groupId>commons-fileupload</groupId>

<artifactId>commons-fileupload</artifactId>

<version>${common-fileupload.version}</version>

</dependency>

<!-- Swagger2 -->

<dependency>

<groupId>io.springfox</groupId>

<artifactId>springfox-swagger2</artifactId>

<version>2.7.0</version>

</dependency>

<dependency>

<groupId>io.springfox</groupId>

<artifactId>springfox-swagger-ui</artifactId>

<version>2.7.0</version>

</dependency>

<!-- fastjson -->

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>fastjson</artifactId>

<version>${fastjson.version}</version>

</dependency>

<!-- 集成drools -->

<dependency>

<groupId>org.drools</groupId>

<artifactId>drools-core</artifactId>

<version>7.0.0.Final</version>

</dependency>

<dependency>

<groupId>org.drools</groupId>

<artifactId>drools-compiler</artifactId>

<version>7.0.0.Final</version>

</dependency>

<dependency>

<groupId>org.drools</groupId>

<artifactId>drools-decisiontables</artifactId>

<version>7.0.0.Final</version>

</dependency>

<dependency>

<groupId>org.drools</groupId>

<artifactId>drools-templates</artifactId>

<version>7.0.0.Final</version>

</dependency>

配置类:

package com.zzg.drools.config;

import org.kie.api.KieServices;

import org.kie.api.builder.KieBuilder;

import org.kie.api.builder.KieFileSystem;

import org.kie.api.builder.KieModule;

import org.kie.api.runtime.KieContainer;

import org.kie.internal.io.ResourceFactory;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class DroolsConfig {

private static final String drlFile = "helloworld.drl";

@Bean

public KieContainer kieContainer() {

KieServices kieServices = KieServices.Factory.get();

KieFileSystem kieFileSystem = kieServices.newKieFileSystem();

kieFileSystem.write(ResourceFactory.newClassPathResource(drlFile));

KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);

kieBuilder.buildAll();

KieModule kieModule = kieBuilder.getKieModule();

return kieServices.newKieContainer(kieModule.getReleaseId());

}

}

package com.zzg.drools.config;

import java.util.HashMap;

import java.util.Map;

import org.springframework.boot.web.servlet.FilterRegistrationBean;

import org.springframework.boot.web.servlet.ServletRegistrationBean;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import com.alibaba.druid.support.http.StatViewServlet;

import com.alibaba.druid.support.http.WebStatFilter;

/**

* druid 监控配置

* @author zzg

*

*/

@Configuration

public class DruidConfig {

@Bean

public ServletRegistrationBean druidServletRegistrationBean() {

ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();

servletRegistrationBean.setServlet(new StatViewServlet());

servletRegistrationBean.addUrlMappings("/druid/*");

servletRegistrationBean.addInitParameter("allow", "");

servletRegistrationBean.addInitParameter("deny", "");

servletRegistrationBean.addInitParameter("loginUsername", "admin");

servletRegistrationBean.addInitParameter("loginPassword", "admin");

return servletRegistrationBean;

}

/**

* 注册DruidFilter拦截

*

* @return

*/

@Bean

public FilterRegistrationBean duridFilterRegistrationBean() {

FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();

filterRegistrationBean.setFilter(new WebStatFilter());

Map<String, String> initParams = new HashMap<String, String>();

//设置忽略请求

initParams.put("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*");

filterRegistrationBean.setInitParameters(initParams);

filterRegistrationBean.addUrlPatterns("/*");

return filterRegistrationBean;

}

}

package com.zzg.drools.config;

import java.util.Properties;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import com.github.pagehelper.PageHelper;

/**

* mybatis 配置对象

* @author zzg

*

*/

@Configuration

public class MyBatisConfig {

/**

* 分页对象实列化

* @return

*/

@Bean

public PageHelper pageHelper() {

PageHelper pageHelper = new PageHelper();

Properties p = new Properties();

p.setProperty("offsetAsPageNum", "true");

p.setProperty("rowBoundsWithCount", "true");

p.setProperty("reasonable", "true");

p.setProperty("dialect", "mysql");

pageHelper.setProperties(p);

return pageHelper;

}

}

package com.zzg.drools.config;

import java.util.ArrayList;

import java.util.List;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import io.swagger.annotations.ApiOperation;

import springfox.documentation.builders.ApiInfoBuilder;

import springfox.documentation.builders.ParameterBuilder;

import springfox.documentation.builders.PathSelectors;

import springfox.documentation.builders.RequestHandlerSelectors;

import springfox.documentation.schema.ModelRef;

import springfox.documentation.service.ApiInfo;

import springfox.documentation.service.Contact;

import springfox.documentation.service.Parameter;

import springfox.documentation.spi.DocumentationType;

import springfox.documentation.spring.web.plugins.Docket;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration

@EnableSwagger2

public class SwaggerConfig {

@Bean

public Docket buildDocket() {

ParameterBuilder tokenPar = new ParameterBuilder();

List<Parameter> pars = new ArrayList<Parameter>();

tokenPar.name("X-CSRF-TOKEN").description("令牌").modelRef(new ModelRef("string")).parameterType("header")

.required(false).build();

pars.add(tokenPar.build());

return new Docket(DocumentationType.SWAGGER_2).select()

.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)).paths(PathSelectors.any())

.build().globalOperationParameters(pars).apiInfo(buildApiInf());

}

private ApiInfo buildApiInf() {

return new ApiInfoBuilder().title("****").termsOfServiceUrl("http://www.baidu.cn/")

.description("API接口")

.contact(new Contact("baidu", "http://www.baidu.cn/", "zhouzhiwengang@163.com"))

.version("2.0").build();

}

}

规则引擎涉及service 、serviceImpl 和controller

package com.zzg.drools.service;

public interface DroolsService {

public String fireRule();

}

package com.zzg.drools.service.impl;

import org.kie.api.runtime.KieContainer;

import org.kie.api.runtime.KieSession;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Isolation;

import org.springframework.transaction.annotation.Propagation;

import org.springframework.transaction.annotation.Transactional;

import com.zzg.drools.domain.Message;

@Service

@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,timeout=36000,rollbackFor=Exception.class)

public class DroolsServiceImpl {

@Autowired

private KieContainer container;

public String fireRule() {

KieSession kSession = container.newKieSession();

// go !

Message message = new Message();

message.setMessage("Hello World");

message.setStatus(Message.HELLO);

// message.setMessage("Goodbye");

// message.setStatus(Message.GOODBYE);

kSession.insert(message);//插入

kSession.fireAllRules();//执行规则

kSession.dispose();

return message.getMessage();

}

}

package com.zzg.drools.controller;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.ResponseBody;

import com.zzg.drools.service.impl.DroolsServiceImpl;

import com.zzg.jreport.response.JreportResponse;

import io.swagger.annotations.Api;

import io.swagger.annotations.ApiOperation;

@Controller

@RequestMapping("/api/drools")

@Api(value = "规则流程引擎Controlle", tags = "规则流程引擎操作服务")

public class DroolsController {

// 日志管理

private Logger logger = LoggerFactory.getLogger(DroolsController.class);

@Autowired

private DroolsServiceImpl service;

@ApiOperation(httpMethod = "POST", value = "规则流程引擎")

@RequestMapping(value = "/rule", method = { RequestMethod.POST }, produces = "application/json;charset=UTF-8")

@ResponseBody

public JreportResponse rule() {

String message = service.fireRule();

return JreportResponse.ok(message);

}

}

其他数据库连接的domain、mapper、service、serviceImpl和controller 省略。

程序入口:

package com.zzg.drools;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.boot.builder.SpringApplicationBuilder;

import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication

@EnableTransactionManagement

@MapperScan("com.zzg.drools.mapper")

public class Application extends SpringBootServletInitializer {

public static void main(String[] args) {

// TODO Auto-generated method stub

SpringApplication.run(Application.class, args);

System.out.println("============= SpringBoot drools Service Start Success =============");

}

@Override

protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {

// 注意这里要指向原先用main方法执行的Application启动类

return builder.sources(Application.class);

}

}

核心资源文件:application.properties、logback.xml和helloword.drl 规则文件。

# æå®æå¡ç«¯å£

server.port=7090

# æå®æå¡ å称

# server.context-path=/jreport

#mybatis xml æ件éç½®

mybatis.mapper-locations=classpath*:mapper/drools/*Mapper.xml

mybatis.type-aliases-package=com.zzg.drools.domain

# MyBatis mysql8 éç½®

spring.datasource.url=jdbc:mysql://192.168.**.**:3306/boot-security?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true&nullCatalogMeansCurrent=true

spring.datasource.username=root

spring.datasource.password=******

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# Druid éç½®

# åå§åæ¶å»ºç«ç©çè¿æ¥ç个æ°

spring.datasource.druid.initial-size=5

# æ大è¿æ¥æ± æ°é

spring.datasource.druid.max-active=30

# æå°è¿æ¥æ± æ°é

spring.datasource.druid.min-idle=5

# è·åè¿æ¥æ¶æ大ç­å¾æ¶é´ï¼åä½æ¯«ç§

spring.datasource.druid.max-wait=60000

# éç½®é´éå¤ä¹æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å³é­ç空é²è¿æ¥ï¼åä½æ¯æ¯«ç§

spring.datasource.druid.time-between-eviction-runs-millis=60000

# è¿æ¥ä¿æ空é²èä¸è¢«é©±éçæå°æ¶é´

spring.datasource.druid.min-evictable-idle-time-millis=300000

# ç¨æ¥æ£æµè¿æ¥æ¯å¦ææçsqlï¼è¦æ±æ¯ä¸ä¸ªæ¥è¯¢è¯­å¥

spring.datasource.druid.validation-query=SELECT 1 FROM DUAL

# 建议é置为trueï¼ä¸å½±åæ§è½ï¼å¹¶ä¸ä¿è¯å®å¨æ§ãç³è¯·è¿æ¥çæ¶åæ£æµï¼å¦æ空é²æ¶é´å¤§äºtimeBetweenEvictionRunsMillisï¼æ§è¡validationQueryæ£æµè¿æ¥æ¯å¦ææã

spring.datasource.druid.test-while-idle=true

# ç³è¯·è¿æ¥æ¶æ§è¡validationQueryæ£æµè¿æ¥æ¯å¦ææï¼åäºè¿ä¸ªéç½®ä¼éä½æ§è½ã

spring.datasource.druid.test-on-borrow=false

# å½è¿è¿æ¥æ¶æ§è¡validationQueryæ£æµè¿æ¥æ¯å¦ææï¼åäºè¿ä¸ªéç½®ä¼éä½æ§è½ã

spring.datasource.druid.test-on-return=false

# æ¯å¦ç¼å­preparedStatementï¼ä¹å°±æ¯PSCacheãPSCache对æ¯æ游æ çæ°æ®åºæ§è½æå巨大ï¼æ¯å¦è¯´oracleãå¨mysqlä¸å»ºè®®å³é­ã

spring.datasource.druid.pool-prepared-statements=true

# è¦å¯ç¨PSCacheï¼å¿é¡»é置大äº0ï¼å½å¤§äº0æ¶ï¼poolPreparedStatementsèªå¨è§¦åä¿®æ¹ä¸ºtrueã

spring.datasource.druid.max-pool-prepared-statement-per-connection-size=50

# éç½®çæ§ç»è®¡æ¦æªçfiltersï¼å»æåçæ§çé¢sqlæ æ³ç»è®¡

#spring.datasource.druid.filters=stat,wall

# éè¿connectPropertieså±æ§æ¥æå¼mergeSqlåè½ï¼æ¢SQLè®°å½

spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

# å并å¤ä¸ªDruidDataSourceççæ§æ°æ®

spring.datasource.druid.use-global-data-source-stat=true

# éç½®sql 注å¥æ¹å¼

spring.datasource.druid.filters=stat

# æ¥å¿æ件éç½®

logging.config=classpath:logback.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- 从高到地低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->

<!-- 日志输出规则 根据当前ROOT 级别,日志输出时,级别高于root默认的级别时 会输出 -->

<!-- 以下 每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志-->

<!-- 属性描述 scan:性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,

默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。

debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->

<configuration scan="true" scanPeriod="60 seconds" debug="false">

<!-- 定义日志文件 输入位置 -->

<property name="log_dir" value="/logs/system-provider" />

<!-- 日志最大的历史 30天 -->

<property name="maxHistory" value="30"/>

<!-- ConsoleAppender 控制台输出日志 -->

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

<!-- 对日志进行格式化 -->

<encoder>

<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n</pattern>

</encoder>

</appender>

<!-- ERROR级别日志 -->

<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender-->

<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">

<!-- 过滤器,只记录WARN级别的日志 -->

<filter class="ch.qos.logback.classic.filter.LevelFilter">

<level>ERROR</level>

<onMatch>ACCEPT</onMatch>

<onMismatch>DENY</onMismatch>

</filter>

<!-- 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责出发滚动 -->

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<!--日志输出位置 可相对、和绝对路径 -->

<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/neo4j-error-log.log</fileNamePattern>

<!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件假设设置每个月滚动,且<maxHistory>是6,

则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除-->

<maxHistory>${maxHistory}</maxHistory>

</rollingPolicy>

<!-- 按照固定窗口模式生成日志文件,当文件大于20MB时,生成新的日志文件。窗口大小是1到3,当保存了3个归档文件后,将覆盖最早的日志。

<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">

<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/.log.zip</fileNamePattern>

<minIndex>1</minIndex>

<maxIndex>3</maxIndex>

</rollingPolicy> -->

<!-- 查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动

<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">

<maxFileSize>5MB</maxFileSize>

</triggeringPolicy> -->

<encoder>

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>

</encoder>

</appender>

<!-- WARN级别日志 appender -->

<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">

<!-- 过滤器,只记录WARN级别的日志 -->

<filter class="ch.qos.logback.classic.filter.LevelFilter">

<level>WARN</level>

<onMatch>ACCEPT</onMatch>

<onMismatch>DENY</onMismatch>

</filter>

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/neo4j-warn-log.log

</fileNamePattern>

<maxHistory>${maxHistory}</maxHistory>

</rollingPolicy>

<encoder>

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>

</encoder>

</appender>

<!-- INFO级别日志 appender -->

<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">

<!-- 过滤器,只记录INFO级别的日志 -->

<filter class="ch.qos.logback.classic.filter.LevelFilter">

<level>INFO</level>

<onMatch>ACCEPT</onMatch>

<onMismatch>DENY</onMismatch>

</filter>

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/neo4j-info-log.log

</fileNamePattern>

<maxHistory>${maxHistory}</maxHistory>

</rollingPolicy>

<encoder>

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>

</encoder>

</appender>

<!-- DEBUG级别日志 appender -->

<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">

<filter class="ch.qos.logback.classic.filter.LevelFilter">

<level>DEBUG</level>

<onMatch>ACCEPT</onMatch>

<onMismatch>DENY</onMismatch>

</filter>

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/neo4j-debug-log.log

</fileNamePattern>

<maxHistory>${maxHistory}</maxHistory>

</rollingPolicy>

<encoder>

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>

</encoder>

</appender>

<logger name="java.sql.PreparedStatement" value="DEBUG" />

<logger name="java.sql.Connection" value="DEBUG" />

<logger name="java.sql.Statement" value="DEBUG" />

<logger name="com.ibatis" value="DEBUG" />

<logger name="com.ibatis.common.jdbc.SimpleDataSource" value="DEBUG" />

<logger name="com.ibatis.common.jdbc.ScriptRunner" level="DEBUG"/>

<logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" value="DEBUG" />

<logger name="org.springframework.web" level="DEBUG"/>

<logger name="com.zzg.drools" level="DEBUG"/>

<!-- root级别 DEBUG -->

<root level="ERROR">

<!-- 控制台输出 -->

<appender-ref ref="STDOUT" />

<!-- 文件输出 -->

<appender-ref ref="ERROR" />

<appender-ref ref="INFO" />

<appender-ref ref="WARN" />

<appender-ref ref="DEBUG" />

</root>

</configuration>

package com.zzg.drools

import com.zzg.drools.domain.Message

dialect "mvel"

rule "Hello World"

dialect "mvel"

when

m : Message(status.equals(Message.HELLO), message : message )

then

System.out.println( message);

modify ( m ) { message = "Goodbye cruel world",status = Message.GOODBYE };

end

rule "Good Bye"

dialect "java"

when

Message( status == Message.GOODBYE, message : message )

then

System.out.println( message );

end

补充规则引擎依赖实体对象Message.java

package com.zzg.drools.domain;

import lombok.Getter;

import lombok.Setter;

@Setter

@Getter

public class Message {

public static final Integer HELLO = 0;

public static final Integer GOODBYE = 1;

private String message;

private Integer status;

}

项目整体结构:

drools规则引擎可视化_Springboot2(60)集成规则引擎Drools相关推荐

  1. drools规则引擎可视化_一文看懂开源工作流引擎 Flowable「转」

    原文链接:[https://xie.infoq.cn/article/ece75889c715e0bc87a73e44c]. 一.工作流引擎使用场景 工作流在企业管理系统中是高频使用的功能,一个最常见 ...

  2. activiti入门系列文章14 - 集成规则引擎drools

    activiti如何集成规则引擎drools呢 三个步骤: 1.pom加入依赖,activiti引擎集成部署器 1.首先进行drools规则编写.然后挂到流程图节点上 2.进行规则文件和bpmn流程文 ...

  3. drools规则引擎可视化

    参考:drools规则引擎可视化 Drools是一款基于Java的优秀的规则引擎,将复杂多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得修改规则不需要改动代码重启服务就能生效. D ...

  4. drools规则引擎技术指南_物联网规则引擎技术

    物联网应用程序设计与典型的IT解决方案大不相同,因为它将物理操作技术(OT)与传感器.致动器和通信设备连接起来,并将数字信息技术(IT)与数据.分析和工作流连接起来. 在企业环境中,物联网非常复杂,这 ...

  5. Fibo Rule规则引擎可视化

    本篇主要讲述决策引擎可视化进阶之路的重要实践,如何通过产品上的创新和技术突破,实现工作效率.系统性能的提升.希望对大家有所帮助! 01 什么是决策引擎 决策引擎是指企业针对其客户提供个性化服务的决策平 ...

  6. groovy 规则引擎 java_Java内嵌Groovy脚本引擎进行业务规则剥离(一)

    一些常见商业应用程序或企业应用,大多都会遇上业务规则在一定的条件下,允许进行一些灵活的配置,以满足业务变化的需要. 解决的方式大致有以下几个方面: 最为传统的方式是java程序直接写死提供几个可调节的 ...

  7. 规则引擎 drools_为什么要用规则引擎?

    作者:孤独烟来源:https://www.cnblogs.com/rjzheng/p/10996186.html 一天,朱斯参加了一场code Review研讨会.会上的一群人正在讨论着如何对祖传代码 ...

  8. python3 规则引擎_几个常见规则引擎的简单介绍和演示

    Ilog JRules 是最有名的商用BRMS: Drools 是最活跃的开源规则引擎: Jess 是Clips的java实现,就如JRuby之于Ruby,是AI系的代表: Visual Rules( ...

  9. 规则引擎 drools_网易考拉规则引擎平台架构设计与实践

    背景 考拉安全部技术这块目前主要负责两块业务:一个是内审,主要是通过敏感日志管理平台搜集考拉所有后台系统的操作日志,数据导入到es后,结合storm进行实时计算,主要有行为查询.数据监控.事件追溯.风 ...

最新文章

  1. 科目二倒车入库不论怎么都能入进去的方法
  2. linux 管道和重定向
  3. 轻舟智航发布Driven-by-QCraft第三代自动驾驶硬件方案
  4. apache 已经加载模块,但是不能解析出开发的rewrite模块功能
  5. 【云周刊】第128期:支撑千亿营收背后秘密——首届阿里巴巴研发效能嘉年华...
  6. 从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~二 DBContext实例中,表实体对象是怎么被加入的...
  7. SNF快速开发平台2019-APP移动端实际应用效果
  8. Python的文件锁使用
  9. 51单片机入门——安装keil5及烧录下载器
  10. 数据挖掘算法和实践(三):朴素贝叶斯(mushrooms蘑菇数据集)
  11. 压力变送器matlab,总结压差变送器三种不同故障以及处理方法[理论结合实际]
  12. kafka eagle的介绍和详细安装教程
  13. 基于Java的截图工具
  14. PS海报制作的常用方法
  15. 英语词组的日常积累(有点长,接近300个)
  16. electron 开发程序禁用gpu渲染
  17. 【考研经验】北京航空航天大学2019年计算机学硕总分第一经验详尽介绍
  18. DeeCamp 2020总冠军,Mixlab社区专访 | AI+积木 = 方仔照相馆
  19. 2020 ViVO面试题
  20. 实验三:Java迷宫生成

热门文章

  1. 这届留学生太惨!美国高校不复课,特朗普政府却要断他们签证;吴恩达:糟糕透顶...
  2. 600页!分享珍藏很久的《推荐系统学习手册》(附链接)
  3. 圆圈中最后剩下的数字
  4. 仅为方便自己记忆一些滤波器【仅为考试】
  5. CVPR | 让合成图像更真实,上交大提出基于域验证的图像和谐化
  6. 基于相交线的双目平面SLAM
  7. 医学图像语义分割最佳方法的全面比较:UNet和UNet++
  8. 三分钟教你快速选择机器视觉传感器
  9. 【从零学习OpenCV 4】Mat类构造与赋值
  10. 本地nginx多域名映射