如图5‑2所示,IoEventType是一个Enum类型,它对I/O事件和I/O请求的类型进行了定义。大多数开发者都不需要直接使用这个类型。

事件类型的其中2个与IoSession请求相关,7个与IoHandler事件相关。在编程中经常会使用int数值类型定义状态或者类型信息,而使用Enum来定义类型信息会更加直观、易于维护。

图5‑2 IoEventType事件类型
image.png

  • 与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的构造方法

  1. /**
  2. * @param type
  3. * @param session
  4. * @param parameter
  5. */
  6. public IoEvent(IoEventType type, IoSession session, Object parameter) {
  7. if (type == null) {
  8. throw new IllegalArgumentException("type");
  9. }
  10. if (session == null) {
  11. throw new IllegalArgumentException("session");
  12. }
  13. this.type = type;
  14. this.session = session;
  15. this.parameter = parameter;
  16. }

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()) {

  1. case MESSAGE_RECEIVED:
  2. getSession().getFilterChain().fireMessageReceived(getParameter());
  3. break;
  4. case MESSAGE_SENT:
  5. getSession().getFilterChain().fireMessageSent((WriteRequest) getParameter());
  6. break;
  7. case WRITE:
  8. getSession().getFilterChain().fireFilterWrite((WriteRequest) getParameter());
  9. break;
  10. case CLOSE:
  11. getSession().getFilterChain().fireFilterClose();
  12. break;
  13. case EXCEPTION_CAUGHT:
  14. getSession().getFilterChain().fireExceptionCaught((Throwable)getParameter());
  15. break;
  16. case SESSION_IDLE:
  17. getSession().getFilterChain().fireSessionIdle((IdleStatus) getParameter());
  18. break;
  19. case SESSION_OPENED:
  20. getSession().getFilterChain().fireSessionOpened();
  21. break;
  22. case SESSION_CREATED:
  23. getSession().getFilterChain().fireSessionCreated();
  24. break;
  25. case SESSION_CLOSED:
  26. getSession().getFilterChain().fireSessionClosed();
  27. break;
  28. default:
  29. throw new IllegalArgumentException("Unknown event type: " + getType());

} }

```


image.png在代码设计中将功能职责进行有效的划分,可以让程序的结构具有较小的颗粒度,代码模块化的程度更高,代码之间的耦合度更小,代码的复用度也会更好。当程序因功能扩展时,能够将扩展的代码与框架本身隔离。