package com.jiuqi.mobile.nigo.comeclose.ws.server; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import com.jiuqi.mobile.nigo.comeclose.bean.app.msg.SmsMassBean; import com.jiuqi.mobile.nigo.comeclose.bean.base.UserBean; import com.jiuqi.mobile.nigo.comeclose.exception.LoginException; import com.jiuqi.mobile.nigo.comeclose.exception.NiGoException; import com.jiuqi.mobile.nigo.comeclose.manager.app.ISmsMassManager; import com.jiuqi.mobile.nigo.comeclose.manager.master.IUserManager; import com.jiuqi.mobile.nigo.comeclose.portal.PortalManagerFactory; public final class Session { // /** * session正常失效时间 */ // private final static long SessionOutTime = 60 * 1000;// 1分钟 private final static long SessionOutTime = 60 * 60 * 1000 * 2;// 2小时 // private final static long SessionOutTime = 1 * 60 * 100;// 1分钟 /** * session最小失效时间,当服务器session缓存量达到系统的90%时,以此时间消耗session * * @see 未实现 */ private final static long SessionMinOutTime = 30000;// 1分钟//30000 // private final static long SessionMinOutTime = 10 * 60000;// 10分钟 private final static int maxSessionNumber = 40000;// session上线40000。 // private final static ThreadLocal<Session> local = new ThreadLocal<Session>(); private final static Object LOCK = new Object(); private static Thread DaemonThread; private static Integer state = 0;// 0.80%发短信1.90%发短信2.100%时发短信 static { initThread(); } private synchronized static void initThread() { if (null == DaemonThread || DaemonThread.isInterrupted()) { DaemonThread = new Thread(new Runnable() { private final List<String> removeList = new ArrayList<String>(); private final int waitTime = 30000; private final int level = (int) (SessionMinOutTime / waitTime); private int time = 0; @Override public void run() { while (true) { synchronized (LOCK) { try { LOCK.wait(waitTime); } catch (InterruptedException e) { continue; } } // 20150522 xuzhe 修改 ,调整session超时为4小时 if (time++ % level == 0) { synchronized (sessionMap) { for (Session s : sessionMap.values()) { if (System.currentTimeMillis() >= s.lastHaveTime + SessionOutTime) { removeList.add(s.getSessionID()); } } } } synchronized (removeList) { System.out.println("++++++清除过期session个数:" + removeList.size()); int size = removeList.size(); for (int i = size - 1; i >= 0; i--) { String key = removeList.remove(i); if (null != key) { synchronized (sessionMap) { if (sessionMap.get(key).getUser() != null) { // LoginOutLogUtil.remove(key, // sessionMap.get(key) // .getUser(), // sessionMap.get(key) // .getRemortIP()); } removeMap.put(key, sessionMap.remove(key)); } } } } System.out.println("++++++++清理后过期sesion当前session个数" + sessionMap.size()); } } }); DaemonThread.setDaemon(true); DaemonThread.start(); } } private final static Map<String, Session> sessionMap = Collections .synchronizedMap(new HashMap<String, Session>());// new Coll<String, // Session>(); private final static Map<String, Session> removeMap = Collections .synchronizedMap(new HashMap<String, Session>());// 被删除掉的session // 暂时未启用 // 与tempMap配合使用 private final String sessionID; // private String requestIP; private String remortIP; private UserBean user; private Object httpServletRequest; private long lastHaveTime; private final Map<String, Object> data = new HashMap<String, Object>(); private Session() { // sessionID = UUID.randomUUID().toString(); // lastHaveTime = System.currentTimeMillis(); // initThread(); this(UUID.randomUUID().toString()); } private Session(String sessionID) { System.out.println("++++++++当前session个数:" + sessionMap.size() + "++++++++总session数:" + maxSessionNumber); synchronized (state) { double percent = (sessionMap.size() + 0.0) / maxSessionNumber; if (percent > 0.8 && percent < 0.9 && state == 0) {// 发送预警信息 warnSms("农机通session达到" + Math.round(percent * 100) + "%了,当前session数量为:" + sessionMap.size());// 发送短信预警 state = 1; } if (percent > 0.9 && percent < 1 && state == 1) {// 发送预警信息 warnSms("农机通session超过" + Math.round(percent * 100) + "%了,当前session数量为:" + sessionMap.size());// 发送短信预警 state = 2; } if (percent >= 1 && state == 2) { warnSms("农机通session超过" + Math.round(percent * 100) + "%了,当前session数量为:" + sessionMap.size());// 发送短信预警 state = 0; } } if (sessionMap.size() >= maxSessionNumber) { throw new SystemBusyException("超过session并发上线"); } synchronized (sessionMap) { if (sessionMap.containsKey(sessionID)) { throw new SessionRepeatStructureException(sessionID); } sessionMap.put(sessionID, this); } this.sessionID = sessionID; lastHaveTime = System.currentTimeMillis(); } /* * 预警短信 */ public void warnSms(String msg) { ISmsMassManager manager = PortalManagerFactory .instanceManager(ISmsMassManager.class); IUserManager manager1 = PortalManagerFactory .instanceManager(IUserManager.class); UserBean userBean = manager1.findByAccount("admin"); SmsMassBean bean = new SmsMassBean(userBean); bean.setFlag(2); bean.setSendMsg(msg); System.out.println(msg); bean.setToMobileNumbers(new String[] { "18638518819", "15538339679" }); try { manager.send(bean); } catch (NiGoException e) { e.printStackTrace(); } } // javax.servlet.http.HttpServletRequest public static Session newSession(Object httpServletRequest, String requestIP) throws LoginException { try { Class<?> request = Class.forName( "javax.servlet.http.HttpServletRequest", true, Thread .currentThread().getContextClassLoader()); if (httpServletRequest.getClass().isAssignableFrom(request)) { throw new LoginException( "javax.servlet.http.HttpServletRequest参数传入错误"); } } catch (ClassNotFoundException e) { throw new LoginException( "javax.servlet.http.HttpServletRequest参数传入错误", e); } Session session = new Session(); session.httpServletRequest = httpServletRequest; session.remortIP = requestIP; // return putSession(session); return session; } // javax.servlet.http.HttpServletRequest public static Session newSession(Object httpServletRequest, String requestIP, String sessionID) throws LoginException { try { Class<?> request = Class.forName( "javax.servlet.http.HttpServletRequest", true, Thread .currentThread().getContextClassLoader()); if (httpServletRequest.getClass().isAssignableFrom(request)) { throw new LoginException( "javax.servlet.http.HttpServletRequest参数传入错误"); } } catch (ClassNotFoundException e) { throw new LoginException( "javax.servlet.http.HttpServletRequest参数传入错误", e); } Session session = new Session(sessionID); session.httpServletRequest = httpServletRequest; session.remortIP = requestIP; // return putSession(session); return session; } public static Session newSession(String requestIP) throws LoginException { Session session = new Session(); session.httpServletRequest = null; session.remortIP = requestIP; // return putSession(session); return session; } public static Session newSession() throws LoginException { Session session = new Session(); session.httpServletRequest = null; session.remortIP = null; // return putSession(session); return session; } public static Session getSession(String sessionID) throws LoginException { if (null == sessionID || "".equals(sessionID.trim())) { return null; } Session session = null; synchronized (sessionMap) { if (null != sessionID) session = sessionMap.get(sessionID); } if (null == session) { StringBuffer s = new StringBuffer("(当前session个数:" + sessionMap.size() + ")"); s.append(" \n "); // for (Session se : sessionMap.values()) { // s.append(se.getSessionID()); // s.append(" "); // } System.out.println("您的登录信息已过期,请重新登录!" + s.toString()); // throw new LoginException("您的登录信息已过期,请重新登录!" + s.toString()); throw new LoginException("您的登录信息已过期,请重新登录!"); } else { session.lastHaveTime = System.currentTimeMillis(); } return session; } public static Session vali(String sessionID) throws LoginException { return getSession(sessionID); } public static Session loginOut(String sessionID) { synchronized (sessionMap) { return sessionMap.remove(sessionID); } } // public static void setThread(Session session) { local.set(session); } public static void removeThread() { local.remove(); } public static Session getThread() { return local.get(); } public static List<Long> getActiveCount() { List<String> accountList = new ArrayList<String>();// 防止重复 List<Long> list = new ArrayList<Long>(); Collection<Session> values = sessionMap.values(); for (Session session : values) { if (session != null && session.getUser() != null) { UserBean user2 = session.getUser(); String account = user2.getAccount(); if (!accountList.contains(account)) { if (user2.getAdminArea() != null && user2.getAdminArea().getCode() != 0l) { accountList.add(account); // list.add(user2.getAdminArea().getCode()); int provinceCode = user2.getAdminArea() .getProvinceCode(); int cityCode = user2.getAdminArea().getCityCode(); String province = (String.valueOf(provinceCode) .length() == 2) ? String.valueOf(provinceCode) : ("0" + String.valueOf(provinceCode)); String city = (String.valueOf(cityCode).length() == 2) ? String .valueOf(cityCode) : ("0" + String .valueOf(cityCode)); list.add(Long.parseLong(province + city)); } } else { continue; } } } return list; } // // private static Session putSession(Session session) { // sessionMap.put(session.sessionID, session); // return session; // } // public String getRemortIP() { return remortIP; } public void setRemortIP(String remortIP) { this.remortIP = remortIP; } public UserBean getUser() { return user; } public void setUser(UserBean user) { this.user = user; } public Object getHttpServletRequest() { return httpServletRequest; } public void setHttpServletRequest(Object httpServletRequest) { this.httpServletRequest = httpServletRequest; } public String getSessionID() { return sessionID; } public Session put(String key, Object value) { data.put(key, value); return this; } public Object get(String key) { return data.get(key); } }