package cn.newgxu.bbs.common.util;
import java.util.Calendar;
import java.util.List;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import cn.newgxu.bbs.domain.TopThree;
import cn.newgxu.bbs.domain.user.User;
/**
* 设置这个类的目的是为了每周定时刷新,可能是因为论坛的历史原因,无法使用Timer或者quartz来自动设置监听(前者entityManager为null,后者有bug,所以自己就写了一个算法来实现。
* 每周日23:00-23:59分内调用这个类的方法即可实现每周更新一次榜单。
* 此外,考虑到重启服务器带来的再次刷新数据的影响,给这个类设置了监听器。
* @author longkai
* @version 1.0
* @since 2012-09-23
*/
public class UpdateLastWeekExp implements ServletContextListener {
private static int week;
private static boolean hasUpdated;
private static Calendar setting;
static {
hasUpdated = false;
setting = Calendar.getInstance();
week = setting.get(Calendar.DAY_OF_WEEK);
// setting.set(Calendar.YEAR, 2012);
// setting.set(Calendar.MONTH, 8);
// setting.set(Calendar.DAY_OF_MONTH, 19);
setting.set(Calendar.HOUR_OF_DAY, 23);
// setting.set(Calendar.MINUTE, 59);
// setting.set(Calendar.SECOND, 59);
}
public static boolean updatable(Calendar calendar) {
// Calendar calendar = Calendar.getInstance();
// calendar.setTime(now);
week = calendar.get(Calendar.DAY_OF_WEEK);
// 如果周一到周六了还没有更新,那么就更新
if (week != Calendar.SUNDAY && !hasUpdated) {
hasUpdated = true;
return true;
}
// 如果周一到周六已经更新了,那么就不更新
if (week != Calendar.SUNDAY)
return false;
// 如果周日,不在23:00 -- 23:59区间内,那么就不更新
if (calendar.get(Calendar.HOUR_OF_DAY) != setting.get(Calendar.HOUR_OF_DAY)) {
// 设置本周还没有更新
hasUpdated = false;
return false;
}
// 如果周日,并且在23:00-23:59区间内,检测到本周已经更新了,那么就不更新
if (hasUpdated)
return false;
hasUpdated = true;
return true;
}
public static String updateLastWeekExp(Calendar now) {
StringBuffer sb = null;
if (updatable(now)) {
// 假如说更新是在周末的23:00-23:59之间进行的,那么就进行保存周前三以及进行颁奖!
if (now.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
List<User> users = User.getLastWeekMostActiveUsers(10);
TopThree t = new TopThree();
t.setWeekly(now.get(Calendar.WEEK_OF_YEAR));
t.setToppedTime(now.getTime());
t.setFirst(users.get(0));
t.setSecond(users.get(1));
t.setThrid(users.get(2));
t.setType(TopThree.LAST_WEEK_ACTIVE_USER_TOP_THREE);
TopThree.persist(t);
// 应网管部要求,暂时取消榜单的自动信息发送 @2012-12-19
// try {
// Message.sendMessage("恭喜您成为上周最活跃榜单前三名", "恭喜您成为“本周最活跃”榜前三位,系统将接下来会给您一份神秘礼物~,希望您再接再厉。欲了解“本周最活跃”排行榜的排名,<a href='/user/users.yws?type=6'>点我~</a>", 1, users.subList(0, 3), User.get(0), "亲爱的雨无声论坛网友!");
// Message.sendMessage("恭喜您成为上周最活跃榜单前十名", "恭喜您成为“本周最活跃”榜前十位,系统将接下来会给您一份神秘礼物~,希望您再接再厉。欲了解“本周最活跃”排行榜的排名,<a href='/user/users.yws?type=6'>点我~</a>", 1, users.subList(3, 10), User.get(0), "亲爱的雨无声论坛网友!");
// 这个系统发送礼物功能后面再加了。。。
sb = new StringBuffer();
for (User user : users.subList(3, 10)) {
sb.append(user.getNick()).append(", ");
}
// } catch (ObjectNotFoundException e) {
// e.printStackTrace();
// }
}
User.updateLastWeekExp();
}
return sb == null ? null : sb.substring(0, sb.lastIndexOf(", "));
}
public void contextInitialized(ServletContextEvent sce) {
// 重启服务器的时候为了避免又刷新榜单,所以设置启动监听器,假定启动时已经是刷新过了的。(这个已启动的概率非常之大,实在不行也可以自己去刷新它,不过无必要了)
Calendar initTime = Calendar.getInstance();
if (initTime.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY)
hasUpdated = true;
// 最好不要在每周日的23:00-23:59重启服务器
else if (initTime.get(Calendar.HOUR_OF_DAY) == 23)
hasUpdated = true;
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("contextDestroyed");
}
public static void main(String[] args) {
}
}