如图5‑2所示,IoEventType是一个Enum类型,它对I/O事件和I/O请求的类型进行了定义。大多数开发者都不需要直接使用这个类型。
事件类型的其中2个与IoSession请求相关,7个与IoHandler事件相关。在编程中经常会使用int数值类型定义状态或者类型信息,而使用Enum来定义类型信息会更加直观、易于维护。
图5‑2 IoEventType事件类型
与IoSession相关的的2个I/O请求类型
- WRITE:Session写消息
- CLOSE:Session被关闭
与IoHandler相关的7个I/O事件类型
- SESSION_CREATED:Session被创建
- SESSION_OPENED:Session被打开
- SESSION_CLOSED:Session被关闭
- SESSION_IDLE:Session处于闲置状态
- MESSAGE_RECEIVED:接收到消息
- MESSAGE_SENT:消息被发送
- EXCEPTION_CAUGHT:捕捉到异常
IoEvent的构造方法
代码清单5‑1 IoEvent的构造方法
/**
* @param type
* @param session
* @param parameter
*/
public IoEvent(IoEventType type, IoSession session, Object parameter) {
if (type == null) {
throw new IllegalArgumentException("type");
}
if (session == null) {
throw new IllegalArgumentException("session");
}
this.type = type;
this.session = session;
this.parameter = parameter;
}
IoEvent的fire方法
如代码清单5‑2所示,IoEvent类型实现了Runnable接口。说明它会被线程执行。而Runnable接口的run方法实际上会去调用fire方法,fire方法本身并没有复杂的业务逻辑,IoEvent事件仅仅根据事件类型去完成一个触发的操作,而具体要被触发的业务逻辑则委派给IoSession的过滤器链去执行,如果将具体的业务逻辑也同时写在该事件中,IoEvent的职责将变得很重,随着功能扩展,新的业务代码也会不断的扩充到fire方法中,现在IoEvent和具体的业务逻辑代码分开了。
- 代码清单5‑2 IoEvent的fire方法
```java
/**
- (non-Javadoc)
- @see java.lang.Runnable#run() */ public void run() { fire(); }
public void fire() {
switch (getType()) {
case MESSAGE_RECEIVED:
getSession().getFilterChain().fireMessageReceived(getParameter());
break;
case MESSAGE_SENT:
getSession().getFilterChain().fireMessageSent((WriteRequest) getParameter());
break;
case WRITE:
getSession().getFilterChain().fireFilterWrite((WriteRequest) getParameter());
break;
case CLOSE:
getSession().getFilterChain().fireFilterClose();
break;
case EXCEPTION_CAUGHT:
getSession().getFilterChain().fireExceptionCaught((Throwable)getParameter());
break;
case SESSION_IDLE:
getSession().getFilterChain().fireSessionIdle((IdleStatus) getParameter());
break;
case SESSION_OPENED:
getSession().getFilterChain().fireSessionOpened();
break;
case SESSION_CREATED:
getSession().getFilterChain().fireSessionCreated();
break;
case SESSION_CLOSED:
getSession().getFilterChain().fireSessionClosed();
break;
default:
throw new IllegalArgumentException("Unknown event type: " + getType());
} }
```
在代码设计中将功能职责进行有效的划分,可以让程序的结构具有较小的颗粒度,代码模块化的程度更高,代码之间的耦合度更小,代码的复用度也会更好。当程序因功能扩展时,能够将扩展的代码与框架本身隔离。