参考资料地址1:https://pan.baidu.com/s/19N2Dw56-c4EMeu3s7hIaTQ 提取码: sjym
参考资料地址2:https://share.weiyun.com/yAMzj8N9 密码:viangd
Reactor 模式也叫做反应器设计模式,它是一种为处理服务请求并发提交到一个或者多个服务处理程序的事件设计模式。当请求抵达后,服务处理程序使用解多路分配策略,然后同步地派发这些请求至相关的请求处理程序。
Reactor翻译过来的意思是:反应堆,所以Reactor设计模式本质是基于事件驱动的。在Reactor设计模式中,存在如下几个角色。
Handle(事件)。Reactor整体是基于Handle进行驱动,这里的Handle叫做事件,可以类比为BIO中的Socket,NIO中的Socket管道。比如当Socket管道有连接建立,或者有数据可读,那么此时就称作事件发生;
EventHandler(事件处理器)。有事件发生,就需要有相应的组件来处理事件,那么这里的组件就叫做事件处理器。EventHandler是一个抽象概念,其会有不同的具体实现,因为事件会有不同的类型,那么不同类型的事件,肯定都需要有相应的具体处理逻辑,这里的具体处理逻辑,就由EventHandler的具体实现来承载;
Concrete Event Handler(具体事件处理器)。是EventHandler的具体实现,用于处理不同类型的事件;
Synchronous Event Demultiplexer(事件多路分解器)。(这里将Synchronous Event Demultiplexer简称为Demultiplexer)Demultiplexer用于监听事件并得到所有发生事件的集合,在监听的状态下是阻塞的,直到有事件发生为止。Demultiplexer有一个很好的类比,就是NIO中的多路复用器Selector,当调用Selector的select() 方法后,会进入监听状态,当从select() 方法返回时,会得到SelectionKey的一个集合,而每一个SelectionKey中就保存着有事件发生的Socket管道;
Initiation Dispatcher(事件分发器)。现在已经有Concrete Event Handler(具体事件处理器)来处理不同的事件,也能通过Synchronous Event Demultiplexer(事件多路分解器)拿到发生的事件,那么最后需要做的事情,肯定就是将事件分发到正确的事件处理器上进行处理,而Initiation Dispatcher就是完成这个分发的事情。
对于Reactor模式来说,他并没队列,每当有一个 Event 输入到 Server端时,Service Handler 会将其转发(dispatch)相对应的handler进行处理。
Reactor的组件主要包括三个:
Reactor:派发器,将 client端的事件分发给相对应的Handler
Acceptor:请求连接器,Reactor 接收到 client 连接事件后,会将其转发给 Acceptor,Acceptor 则会接受 Client 的连接,建立对应的Handler,并向 Reactor注册此Handler
Handler:请求处理器,负责事件的处理。
介绍一下 Proactor 模式的工作流程:
Proactor Initiator 负责创建 Proactor 和 Handler 对象,并将 Proactor 和 Handler 都通过 Asynchronous Operation Processor 注册到内核;
Asynchronous Operation Processor 负责处理注册请求,并处理 I/O 操作;Asynchronous Operation Processor 完成 I/O 操作后通知 Proactor;
Proactor 根据不同的事件类型回调不同的 Handler 进行业务处理;
Handler 完成业务处理;
在EmosWxApiApplication.java文件中创建init()方法,读取常量数据并缓存
@SpringBootApplication
@ServletComponentScan
@Slf4j
public class EmosWxApiApplication {
@Autowired
private SysConfigDao sysConfigDao;
@Autowired
private SystemConstants constants;
public static void main(String[] args) {
SpringApplication.run(EmosWxApiApplication.class, args);
}
@PostConstruct
public void init() {
List<SysConfig> list = sysConfigDao.selectAllParam();
list.forEach(one -> {
String key = one.getParamKey();
key = StrUtil.toCamelCase(key);
String value = one.getParamValue();
try {
Field field = constants.getClass().getDeclaredField(key);
field.set(constants, value);
} catch (Exception e) {
log.error("执行异常", e);
}
});
}
}
因为查询当月数据,以及查询某月数据,都要提交Ajax请求,所以不如把这部分代码封装起来,然后再调用更加省事。
searchCheckin: function(ref, year, month) {
let that = ref;
that.sum_1 = 0;
that.sum_2 = 0;
that.sum_3 = 0;
that.list.length = 0;
that.ajax(that.url.searchMonthCheckin, 'POST', { year: year, month: month }, function(resp) {
for (let one of resp.data.list) {
if (one.status!=null && one.status != '') {
let color = '';
if (one.status == '正常') {
color = 'green';
} else if (one.status == '迟到') {
color = 'orange';
} else if (one.status == '缺勤') {
color = 'red';
}
that.list.push({
date: one.date,
info: one.status,
color: color
});
}
}
that.sum_1 = resp.data.sum_1;
that.sum_2 = resp.data.sum_2;
that.sum_3 = resp.data.sum_3;
});
}
有疑问加站长微信联系(非本文作者)