从0开始用kotlin作CRM之邮件系统--2.2引入规则引擎drools

需求:git

  • 1.当邮件标题或内容中,包含某些关键字时,将邮件设为只能领导处理
  • 2.根据不一样的关键字,给邮件打tag
  • 3.关键字,tag,项能够交用户配置

在上一章中,咱们已经能成功的收取gmail邮件了。在这一章中,咱们将使用drools对其进行处理。
规则引擎选择drools,主要缘由是用的人比较多,对于我这种新手来说,能找到的资料会更多,而且看了几个规则引擎,大可能是英文的,头痛,因此找个方便点的。drools的缺点是比较重,你们能够自行选择。
咱们今天是先实现drools的介入(题外话,若是要经过视频系统学drools7,能够看下csdn学院的视频教程。B站也有一个系列的,可是声音效果不佳,文章csdn多一些,掘金不多)github

  • 引入依赖:2019.09.11查到的最新版本是7.9.0

<drools.version>7.9.0.Final</drools.version>

<dependency>
			<groupId>org.drools</groupId>
			<artifactId>drools-core</artifactId>
			<version>${drools.version}</version>
		</dependency>

		<dependency>
			<groupId>org.drools</groupId>
			<artifactId>drools-compiler</artifactId>
			<version>${drools.version}</version>
		</dependency>

		<dependency>
			<groupId>org.kie</groupId>
			<artifactId>kie-spring</artifactId>
			<version>${drools.version}</version>
		</dependency>

		<dependency>
			<groupId>org.kie</groupId>
			<artifactId>kie-internal</artifactId>
			<version>${drools.version}</version>
		</dependency>

		<dependency>
			<groupId>org.drools</groupId>
			<artifactId>drools-templates</artifactId>
			<version>${drools.version}</version>
		</dependency>
复制代码
  • 加xml:听说这个是必须的?我还没试能不能不要

  • 引入工具类:读rules的,来源于github
object KieSessionUtils {
    private var kieSession: KieSession? = null
    private val RULES_PATH = "rules/"
    /**
     * @description TODO(建立包含全部规则的对象)
     * @throws Exception
     * @return KieSession
     */
    val allRules: KieSession?
        @Throws(Exception::class)
        get() {
            try {
                disposeKieSession()
                val kieServices = KieServices.Factory.get()
                val kieFileSystem = kieServices.newKieFileSystem()
                for (file in PathMatchingResourcePatternResolver().getResources("classpath*:$RULES_PATH**/*.*")) {
                    kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.filename!!, "UTF-8"))
                }
                val kieRepository = KieServices.Factory.get().repository
                kieRepository.addKieModule { kieRepository.defaultReleaseId }
                val kieBuilder = KieServices.Factory.get().newKieBuilder(kieFileSystem)
                kieBuilder.buildAll()
                kieSession = KieServices.Factory.get().newKieContainer(kieRepository.defaultReleaseId).newKieSession().kieBase.newKieSession()
                return kieSession
            } catch (ex: Exception) {
                throw ex
            }

        }

    /**
     * @description TODO (快速新建KieSession)
     * @param classPath 绝对路径
     * @return KieSession 有状态
     */
    @Throws(Exception::class)
    fun newKieSession(classPath: String): KieSession {
        val kieSession = getKieBase(classPath).newKieSession()
        kieSession.addEventListener(DebugRuleRuntimeEventListener())
        return kieSession

    }

    /**
     * @description TODO (快速新建StatelessKieSession)
     * @param classPath 绝对路径
     * @return StatelessKieSession 无状态
     */
    @Throws(Exception::class)
    fun newStatelessKieSession(classPath: String): StatelessKieSession {
        return getKieBase(classPath).newStatelessKieSession()

    }

    /**
     * @description TODO (清空对象)
     * @title disposeKieSession 重置KieSession
     * @return void
     */
    fun disposeKieSession() {
        if (kieSession != null) {
            kieSession!!.dispose()
            kieSession = null
        }
    }

    @Throws(Exception::class)
    internal fun getKieBase(classPath: String): KieBase {
        val kieServices = KieServices.Factory.get()
        val kfs = kieServices.newKieFileSystem()
        //Resource resource = kieServices.getResources().newClassPathResource(classPath);
        val resource = ResourceFactory.newFileResource(classPath)
        kfs.write(resource)
        val kieBuilder = kieServices.newKieBuilder(kfs).buildAll()
        if (kieBuilder.results.getMessages(Message.Level.ERROR).size > 0) {
            throw Exception()
        }
        val kieContainer = kieServices.newKieContainer(kieServices.repository.defaultReleaseId)
        return kieContainer.kieBase
    }

    /**
     * 根据服务器真实路径下的xls文件生成drl文件内容
     */
    @Throws(FileNotFoundException::class)
    fun getKieSessionFromXLS(realPath: String): KieSession {
        return createKieSessionFromDRL(getDRL(realPath))
    }

    // 把xls文件解析为String
    @Throws(FileNotFoundException::class)
    fun getDRL(realPath: String): String {
        val file = File(realPath) // 例如:C:\\abc.xls
        val `is` = FileInputStream(file)
        val compiler = SpreadsheetCompiler()
        return compiler.compile(`is`, InputType.XLS)
    }

    // drl为含有内容的字符串
    fun createKieSessionFromDRL(drl: String): KieSession {
        val kieHelper = KieHelper()
        kieHelper.addContent(drl, ResourceType.DRL)
        val results = kieHelper.verify()
        if (results.hasMessages(Message.Level.WARNING, Message.Level.ERROR)) {
            val messages = results.getMessages(Message.Level.WARNING, Message.Level.ERROR)
            for (message in messages) {
                println("Error: " + message.text)
            }
            throw IllegalStateException("Compilation errors were found. Check the logs.")
        }
        return kieHelper.build().newKieSession()
    }

复制代码
  • 加rule:参见JAVA规则引擎 引入的这个系统邮件类,是不能修改的
  • 测试

相关文章
相关标签/搜索