2010.12.7 继续查找关键字MostUsersEverOnline
下面这段是存在于net.jforum.view.forum/ForumAction.java中
public void list()
{
this.setTemplateName(TemplateKeys.FORUMS_LIST); //这句没看懂,从字面看应该是设置模板的名称
this.context.put("allCategories", ForumCommon.getAllCategoriesAndForums(true));//页面显示的所有分类和板块(检查有无未读的贴子)
this.context.put("topicsPerPage", Integer.valueOf(SystemGlobals.getIntValue(ConfigKeys.TOPICS_PER_PAGE)));
this.context.put("rssEnabled", SystemGlobals.getBoolValue(ConfigKeys.RSS_ENABLED));
this.context.put("totalMessages", Integer.valueOf(ForumRepository.getTotalMessages()));//页面显示的总文章数
this.context.put("totalRegisteredUsers", ForumRepository .totalUsers()); //页面显示的总注册人数
this.context.put("lastUser", ForumRepository.lastRegisteredUser()); //页面显示的最后注册用户
SimpleDateFormat df = new SimpleDateFormat(SystemGlobals.getValue(ConfigKeys.DATE_TIME_FORMAT), Locale.getDefault());
GregorianCalendar gc = new GregorianCalendar();
this.context.put("now", df.format(gc.getTime())); //页面显示的当前时间
this.context.put("lastVisit", df.format(SessionFacade.getUserSession().getLastVisit())); //应该是取最后登录时间
this.context.put("forumRepository", new ForumRepository()); //暂时没看懂,字面是应该页面显示的主体
// Online Users
this.context.put("totalOnlineUsers", Integer.valueOf(SessionFacade.size())); //页面显示的当前在线人数 ,后面有再次设置,不知此句是否是多余的。
int aid = SystemGlobals.getIntValue(ConfigKeys.ANONYMOUS_USER_ID); //取游客ID
List
// Check for an optional language parameter
UserSession currentUser = SessionFacade.getUserSession(); //取当前用户
if (currentUser.getUserId() == aid) { //当前用户为游客
String lang = this.request.getParameter("lang"); //语言
if (lang != null && I18n.languageExists(lang)) {
currentUser.setLang(lang); //设置语言
}
}
// If there are only guest users, then just register
// a single one. In any other situation, we do not
// show the "guest" username
if (onlineUsersList.isEmpty()) {
UserSession us = new UserSession();
us.setUserId(aid);
us.setUsername(I18n.getMessage("Guest"));
us.setStartTime(new Date(System.currentTimeMillis()));
onlineUsersList.add(us);
}
int registeredSize = SessionFacade.registeredSize(); //取在线会员
int anonymousSize = SessionFacade.anonymousSize(); //取在线游客
int totalOnlineUsers = registeredSize + anonymousSize; //取在线人数
this.context.put("userSessions", onlineUsersList); //设置页面显示的在线用户列表
this.context.put("totalOnlineUsers", Integer.valueOf(totalOnlineUsers));//设置页面显示的在线会员
this.context.put("totalRegisteredOnlineUsers", Integer.valueOf(registeredSize)); //设置页面显示的在线游客
this.context.put("totalAnonymousUsers", Integer.valueOf(anonymousSize)); //设置页面显示的在线人数
// Most users ever online 峰值人数和时间
MostUsersEverOnline mostUsersEverOnline = ForumRepository.getMostUsersEverOnline(); //取记录的峰值人数和时间
if (totalOnlineUsers > mostUsersEverOnline.getTotal()) { //当前在线人数大于峰值人数
mostUsersEverOnline.setTotal(totalOnlineUsers); //设置峰值人数
mostUsersEverOnline.setTimeInMillis(System.currentTimeMillis()); //设置峰值时间
ForumRepository.updateMostUsersEverOnline(mostUsersEverOnline); //将峰值人数和时间记入数据表
}
this.context.put("mostUsersEverOnline", mostUsersEverOnline); //设置页面显示的峰值人数和时间
}
小结:
峰值人数的检查和更新,应该是在这里完成的。
从笔记一到笔记六,完成了对峰值人数和时间的整个分析。
ForumRepository. getMostUsersEverOnline()//取峰值信息
此处会调用(MostUsersEverOnline)cache.get(FQN, MOST_USERS_ONLINE); //从缓存中取峰值人数
如果值为空,则通过 instance.loadMostUsersEverOnline(DataAccessDriver.getInstance().newConfigDAO());
调用了ForumRepository. loadMostUsersEverOnline(ConfigDAO cm)//从数据表读取峰值人数信息
如果当前在线总人数超过峰值,则会调用ForumRepository. updateMostUsersEverOnline(MostUsersEverOnline m) //设置峰值人数。
而此过程会通过ConfigDAO.insert(config)向参数数据表中插入新值或通过ConfigDAO.update(config)更新参数数据表中内容,并且cache.add(FQN, MOST_USERS_ONLINE, m); //修改缓存中的值