IoEvent是MINA提供的IO事件或IO请求的类
package org.apache.mina.core.session;
import org.apache.mina.core.write.WriteRequest;
/**
* An I/O event or an I/O request that MINA provides.
* Most users won't need to use this class. It is usually used by internal
* components to store I/O events.内部用来存储IO事件
*
*/
public class IoEvent implements Runnable {
private final IoEventType type;
private final IoSession session;
private final Object 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;
}
public IoEventType getType() {
return type;
}
public IoSession getSession() {
return session;
}
public Object getParameter() {
return parameter;
}
public void run() {
fire();
}
/**
* 这里的fire函数和IoFilterEvent中的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());
}
}
@Override
public String toString() {
if (getParameter() == null) {
return "[" + getSession() + "] " + getType().name();
}
return "[" + getSession() + "] " + getType().name() + ": "
+ getParameter();
}
}
IoFilterEvent是MINA提供给 IoFilter 过滤器的IO事件或IO请求
package org.apache.mina.core.filterchain;
import org.apache.mina.core.filterchain.IoFilter.NextFilter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoEvent;
import org.apache.mina.core.session.IoEventType;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.write.WriteRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* An I/O event or an I/O request that MINA provides for {@link IoFilter}s.
* Most users won't need to use this class. It is usually used by internal
* components to store I/O events.
* 1、IoEvent 事件类实现了Runnable接口,是一个线程类,所以此类也是一个线程类,可以并发执行
* 2、此过滤事件类继承了IoEvent的run()方法(run方法中调用fire方法),重写了fire()方法
* 3、IoEvent类的fire()方法表示收到了IO事件通知,并把事件传递给过滤器链
* 4、IoFilterEvent类的fire()方法表示把收到的事件处理完后继续交给下一个过滤器处理
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
*/
public class IoFilterEvent extends IoEvent {
/** A logger for this class */
static Logger LOGGER = LoggerFactory.getLogger(IoFilterEvent.class);
/** A speedup for logs */
static boolean DEBUG = LOGGER.isDebugEnabled();
private final NextFilter nextFilter;
public IoFilterEvent(NextFilter nextFilter, IoEventType type,
IoSession session, Object parameter) {
super(type, session, parameter);
if (nextFilter == null) {
throw new IllegalArgumentException("nextFilter must not be null");
}
this.nextFilter = nextFilter;
}
public NextFilter getNextFilter() {
return nextFilter;
}
@Override
public void fire() {//这里是在过滤器链中传递事件,调用下一个过滤器处理事件和信息
IoSession session = getSession();
NextFilter nextFilter = getNextFilter();
IoEventType type = getType();
if (DEBUG) {
LOGGER.debug( "Firing a {} event for session {}",type, session.getId() );
}
switch (type) {
case MESSAGE_RECEIVED:
Object parameter = getParameter();
nextFilter.messageReceived(session, parameter);
break;
case MESSAGE_SENT:
WriteRequest writeRequest = (WriteRequest)getParameter();
nextFilter.messageSent(session, writeRequest);
break;
case WRITE:
writeRequest = (WriteRequest)getParameter();
nextFilter.filterWrite(session, writeRequest);
break;
case CLOSE:
nextFilter.filterClose(session);
break;
case EXCEPTION_CAUGHT:
Throwable throwable = (Throwable)getParameter();
nextFilter.exceptionCaught(session, throwable);
break;
case SESSION_IDLE:
nextFilter.sessionIdle(session, (IdleStatus) getParameter());
break;
case SESSION_OPENED:
nextFilter.sessionOpened(session);
break;
case SESSION_CREATED:
nextFilter.sessionCreated(session);
break;
case SESSION_CLOSED:
nextFilter.sessionClosed(session);
break;
default:
throw new IllegalArgumentException("Unknown event type: " + type);
}
if (DEBUG) {
LOGGER.debug( "Event {} has been fired for session {}", type, session.getId() );
}
}
}