private final IoService service;
private final List<IoServiceListener> listeners = new CopyOnWriteArrayList<IoServiceListener>();
private final ConcurrentMap<Long, IoSession> managedSessions = new ConcurrentHashMap<Long, IoSession>();//被管理的会话集(其实就是服务所管理的会话集)
private final Map<Long, IoSession> readOnlyManagedSessions = Collections.unmodifiableMap(managedSessions);//上面的会话集的只读版
private final AtomicBoolean activated = new AtomicBoolean();//被管理的服务是否处于激活状态
激活事件就以会话创建为例来说明:
public void fireSessionCreated(IoSession session)
{
boolean firstSession = false;
if (session.getService() instanceof IoConnector)
{//若服务类型是Connector,则说明是客户端的连接服务
synchronized (managedSessions)
{//锁住当前已经建立的会话集
firstSession = managedSessions.isEmpty();//看服务所管理的会话集是否为空集
}
}
if (managedSessions.putIfAbsent(Long.valueOf(session.getId()), session) != null) { // If already registered, ignore.
return;
}
if (firstSession)
{//第一个连接会话,fire一个虚拟的服务激活事件
fireServiceActivated();
}
//呼叫过滤器的事件处理
session.getFilterChain().fireSessionCreated();// 会话创建
session.getFilterChain().fireSessionOpened();//会话打开
int managedSessionCount = managedSessions.size();
//统计管理的会话数目
if (managedSessionCount > largestManagedSessionCount)
{
largestManagedSessionCount = managedSessionCount;
}
cumulativeManagedSessionCount ++;
//呼叫监听者的事件处理函数
for (IoServiceListener l : listeners)
{
try
{
l.sessionCreated(session);
} catch (Throwable e)
{
ExceptionMonitor.getInstance().exceptionCaught(e);
}
}
}
这里值得注意的一个地方是断开连接会话,设置了一个监听锁,直到所有连接会话被关闭后才放开这个锁。
private void disconnectSessions()
{
if (!(service instanceof IoAcceptor))
{//确保服务类型是IoAcceptor
return;
}
if (!((IoAcceptor) service).isCloseOnDeactivation())
{// IoAcceptor是否设置为在服务失效时关闭所有连接会话
return;
}
Object lock = new Object();//监听锁
IoFutureListener<IoFuture> listener = new LockNotifyingListener(lock);
for (IoSession s : managedSessions.values())
{
s.close().addListener(listener);//为每个会话的close动作增加一个监听者
}
try
{
synchronized (lock)
{
while (!managedSessions.isEmpty())
{//所管理的会话还没有全部结束,持锁等待
lock.wait(500);
}
}
} catch (InterruptedException ie)
{
// Ignored
}
}
private static class LockNotifyingListener implements IoFutureListener<IoFuture>
{
private final Object lock;
public LockNotifyingListener(Object lock)
{
this.lock = lock;
}
public void operationComplete(IoFuture future)
{