需求:
- 1.当邮件标题或内容中,包含某些关键字时,将邮件设为只能领导处理
- 2.根据不同的关键字,给邮件打tag
- 3.关键字,tag,项可以交用户配置
在上一章中,我们已经能成功的收取gmail邮件了。在这一章中,我们将使用drools对其进行处理。
规则引擎选择drools,主要原因是用的人比较多,对于我这种新手来讲,能找到的资料会更多,并且看了几个规则引擎,大多是英文的,头痛,所以找个方便点的。drools的缺点是比较重,大家可以自行选择。
我们今天是先实现drools的介入(题外话,如果要通过视频系统学drools7,可以看下csdn学院的视频教程。B站也有一个系列的,但是声音效果不佳,文章csdn多一些,掘金很少)
- 引入依赖: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规则引擎
引入的这个系统邮件类,是不能修改的
- 测试