HttpSessionManager
该类管理所有通过httpbing连接到openfire的议定。它是一个同步http的双向流
http://www.xmpp.org/extensions/xep-0124.html
构造方法:HttpSessionManager()
配置一个汇集执行者对异步路由传进来的数据的默认大小配置默认为60秒
注意:在默认情况下,服务支持最大254个客户端。这时候BOSH 承载着非常大的负荷,那么这就需要额外的分配一些线程池容量以供客户端及时入站点。
public HttpSessionManager() {
this.sessionManager = SessionManager.getInstance();
int poolSize = JiveGlobals.getIntProperty("xmpp.httpbind.worker.threads",
JiveGlobals.getIntProperty("xmpp.client.processing.threads", 16));
int keepAlive = JiveGlobals.getIntProperty("xmpp.httpbind.worker.timeout", 60);
sendPacketPool = new ThreadPoolExecutor(poolSize, poolSize, keepAlive, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(), // unbounded task queue
new ThreadFactory() { // custom thread factory for BOSH workers
final AtomicInteger counter = new AtomicInteger(1);
public Thread newThread(Runnable runnable) {
Thread thread = new Thread(Thread.currentThread().getThreadGroup(), runnable,
"httpbind-worker-" + counter.getAndIncrement());
thread.setDaemon(true);
return thread;
}
});
}
ThreadPoolExecutor该线程池配置了:池中所保持的线程数和最大线程数均为poolSize(16),
keepAlive多余空闲线程等待心任务的的最长时间。
TimeUnit.SECONDS:参数的时间单位
newLinkedBlockingQueue<Runnable>():执行前保持的队列,此队列仅保持由execute 方法提交的 Runnable 任务。
ThreadFactory:执行程序创建新线程时使用的工厂。
启动sessionManager
public void start() {
inactivityTask = new HttpSessionReaper();
TaskEngine.getInstance().schedule(inactivityTask, 30 * JiveConstants.SECOND,
30 * JiveConstants.SECOND);
sendPacketPool.prestartCoreThread();
}
HttpSessionReaper该类是个记时任务类。覆盖了TimerTask中的run方法。我们先看看该方法的内容
public void run() {
long currentTime = System.currentTimeMillis();
for (HttpSession session : sessionMap.values()) {
long lastActive = currentTime - session.getLastActivity();
if (Log.isDebugEnabled()) {
Log.debug("Session was last active " + lastActive + " ms ago: " + session.getAddress());
}
if (lastActive > session.getInactivityTimeout() * JiveConstants.SECOND) {
Log.info("Closing idle session: " + session.getAddress());
session.close();
}
}
}
session.getLastActivity():这个方法以毫秒为时间单位返回关闭http连接的时间。
getInactivityTimeout() 这个方法以秒为单位返回不活跃或被终止会话时间
这里用系统时间减去http关闭连接时间。也就是说在关闭连接的时间与系统当先的这段时间,该会话在服务端系统就是一个闲置的状态。下面的方法:
if (lastActive > session.getInactivityTimeout() * JiveConstants.SECOND) {
Log.info("Closing idle session: " + session.getAddress());
session.close();
}
当这个闲置时间大于这个不活跃或被关闭连接的时候,这里就执行session.close()方法来结束这个会话。
回过头来,再看start()方法。
TaskEngine.getInstance().schedule(inactivityTask, 30 * JiveConstants.SECOND,30 * JiveConstants.SECOND);
TaskEngine该类使用工作线程来执行任务。它还可以安排任务执行的时间,该类模拟了ExecutorService和Timer。任何TimerTask,按预定计划运行在未来将会被自动运行使用线程执行器的线程池。这意味着标准的限制,TimerTasks并不适用快速运行。
Schedule()方法:
安排指定重复任务(固定的延迟执行)。Subsequent executions take place at approximatelyregular intervals separated by the specified period.
在固定延迟执行,每个执行计划相对于实际执行时间前执行。如果一个执行延迟由于任何原因(如垃圾回收或其他后台活动),后续执行也将推迟。从长远来看,执行的频率通常是略低于指定的周期的倒数(假设系统时钟底层对象等(长)是准确的)。
固定延迟执行适当的重复出现的活动,要求“smoothness“换句话说,它是适合他们的活动,更重要的是要保持频率准确在短期内比从长远来看。这包括大多数动画任务,如闪烁的光标定期。它还包括任务中执行常规的活动在回应人类输入,如自动重复字符只要一个关键是压低频率。
调用该方法的三个参数:
inactivityTask:需要调度的任务
30 * JiveConstants.SECOND:执行任务之前延迟的毫秒数