首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

2.报警系统QuickAlarm之报警执行器的设计与实现

报警系统QuickAlarm之报警执行器的设计与实现

title

根据前面一篇总纲的博文,将整体结构划分为了四大块,本文则主要目标集中在第一块,报警执行器(AlarmExecute)的设计与加载上了

主要的关注点无外乎 定义-》加载-》实现逻辑三块了:

AlarmExecute 的接口定义

如何加载用户自定义的AlarmExecute

AlarmExecute的内部实现

I. AlarmExecute接口定义

在定义接口之前,先来根据几个问题来加深下这个概念的理解:

1. 基础知识

说一下这个报警执行器到底是干嘛的?

执行具体的报警逻辑(感觉说了依据废话)

因此不同的报警方式,可以选择不同的实现,这个强业务关联的逻辑可以交由适用方自己来把控

多个alarmExecute之间如何区分?

给一个类似身份证的标识,将标识与alarmExecute绑定,则可以报警规则中,用这个标识来表示对应的报警执行器

标识要求全局唯一,否则就没法找到对应的执行器

2. 接口定义

根据上面的基础知识,那么很容易给出接口的定义了

第一个方法sendMsg也就是需要使用者来实现的具体执行报警代码的核心模块了,比较清晰,其中用户是列表,因此,支持同时报警给多个用户(但是报警内容都是相同的)

第二个方法getName表示获取标识,默认给了一个实现,规则如下

获取类的 SimpleName

干掉类名后面的Execute(如果不是以这个结尾的就不需要了)

剩下的全部转大写

实例:SmsExecute -> SMS; LogExecute -> LOG;

3. 额外说明

上面接口定义中的sendMsg中,支持给多个用户发送报警信息,如果要求每个报警信息都不同,比如最常见的是:

发送一段文本,其中通知人地方根据报警人来替换,其他的不变

当然这样的场景完全可以自己在实现中来做

传入的content作为一个话术模板

然后利用 String#format() 来实现参数代替

当然更激进一点就是,穿进来的title或者content作为一个key,然后我可以通过这个key,到其他的地方(如db,缓存等)获取报警内容,甚至我连传进来的报警人都不care,直接从其他地方来获取

简单来说,这个实现委托给用户自己实现,你完全可以随意的控制,做任何你想做的事情

II. AlarmExecute的加载

1. 问题分析

加载AlarmExecut,貌似没有什么特别复杂的东西,一般的思路是创建一个简单工厂类,然后实例化对应的Executor返回,(再多一点确保只有一个实例对象,加以缓存)

这样有什么问题?

很简单的实现,但是我们需要加载用户自定义的执行器,要怎么支持呢?

几种可行的解决手段

1. 开放一个注册接口

这个可算是最容易想到的了,直接让用户把自己的Executor实例,主动的扔进来

2. 抽象工厂

将前面说的简单工厂,改成抽象工厂类,让后具体的加载委托给用户自己来做

3. 借助Spring容器来加载

如果所有的AlarmExecute都委托给Spring容器来管理,那么就很简单了,直接通过来获取所有的执行器即可

4. SPI加载方式

通过JDK的spi机制来实现(详细后面来说)

针对上面的几个手段,首先排除掉前面两个,因为不满足我们的设计目标一:

简单 (只有报警这个接口进行交互,不需要额外的接口调用)

然后也排除掉spring容器,因为我们希望这个东西,可以较独立的被引用到java工程中,后面可以看情况实现一个spring版

从使用来讲,由spring容器来托管的方式,对使用者而言,是最简单,成本最低的,因为不需要额外添加SPI配置

2. 实现

我们采用SPI方式来实现加载,对于SPI是什么东西,这里不详细展看,有兴趣的童鞋可以看我之前的一个系类博文:自定义SPI框架设计

实现方式,可说是非常简单了

上面对外就暴露一个方法,内部比较简单,如果传入标识对应的报警器没有,则返回一个默认的,确保不会因此挂掉

通过SPI加载所有的执行器的逻辑就一行

然后需要关注的是循环内部,做了name的唯一性判断,不满足就直接抛出异常了

III. AlarmExecute内部实现

内部提供了两个基本的报警实现,比较简单

日志报警执行器

空报警执行器

IV. 小结

AlarmExecute 的定义,加载以及实现规则目前都已经完成

定义:两个方法,一个执行报警方法,一个返回唯一标识方法

加载:通过SPI方式加载所有定义的alarmExecute

实现:由用户自定义实现IExecute接口,内部逻辑无任务特殊要求,只是需要确保每个executor的name唯一

整个系统的第一步已经迈出,但是有个问题就是什么时候,才会来调用

从而触发执行器的加载呢?

V. 其他

系列博文总共将有六篇如下,关注后可查看

报警系统QuickAlarm总纲

报警系统QuickAlarm之报警执行器的设计与实现

报警系统QuickAlarm之报警规则的设定与加载

报警系统QuickAlarm之报警规则解析

报警系统QuickAlarm之频率统计及接口封装

报警系统QuickAlarm使用手册

项目

项目地址:Quick-Alarm = https://github.com/liuyueyi/quick-alarm

博客地址:小灰灰Blog = https://liuyueyi.github.io/hexblog/

声明

尽信书则不如,已上内容,纯属一家之言,因本人能力一般,见解不全,如有问题,欢迎批评指正

扫描关注,java分享

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180306A1J7S500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券