SpringBoot2.x 集成规则引擎Drools

无情 阅读:594 2021-03-31 16:55:34 评论:0

任务要求:SpringBoot 2.x 集成规则引擎(Drools)开发环境, 实现简单规则引擎测试功能。

核心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; 
} 

项目整体结构:

标签:Spring Boot
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号