public interface ICallback
{
/**
* 捕获异常
* @param session Session
*/
public void handleTimeout(Session session);
}
public class Session
{
private final String id;
private final int sessionTimeout;
private ICallback callback;
public Object obj1;
/**
* Session构造函数
* @param id String
*/
public Session(final String id, final int sessionTimeout)
{
this.id = id;
this.sessionTimeout = sessionTimeout;
}
public ICallback getCallback()
{
return callback;
}
/**
* setCallback
* @param callback ICallback
*/
public void setCallback(ICallback callback)
{
this.callback = callback;
if (this.callback != null)
{
SessionManager.getInstance().addCallbackToSession(this, callback);
}
}
public String getId()
{
return id;
}
public int getSessionTimeout()
{
return sessionTimeout;
}
/**
* 发送消息
* @param message 消息
* @param channel Channel
* @see [类、类#方法、类#成员]
*/
public ChannelFuture sendMessage(AopMessage message, Channel channel)
{
if (channel != null && channel.isOpen())
{
return channel.write(message);
}
return null;
}
/**
* hashCode
* @return int
*/
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
/**
* equals
* @param obj Object
* @return boolean
*/
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
Session other = (Session)obj;
if (id == null)
{
if (other.id != null)
{
return false;
}
}
else if (!id.equals(other.id))
{
return false;
}
return true;
}
}
public class SessionManager
{
private static final IDebugLogger LOG = LogFactory.getDebugLogger(SessionManager.class);
private static SessionManager ins = new SessionManager();
private final Map<String, Session> sessionMap = new ConcurrentHashMap<String, Session>();
private final Map<String, Timeout> timerMap = new ConcurrentHashMap<String, Timeout>();
private final Timer timer = NettyServer.TIMER;
private static int sessionTime;
public void init()
{
UnModifyConfig unModifyConfig = BUS.getBean("unModifyConfig");
sessionTime = unModifyConfig.getPushSessionTimeOut();
}
public static SessionManager getInstance()
{
return ins;
}
/**
* 创建一个Session
* @param id sessionID
* @return Session
* @see [类、类#方法、类#成员]
*/
public Session createSession(String id)
{
LOG.debug("Begin to create session id = {}", id);
final Session s = new Session(id, 0);
sessionMap.put(id, s);
return s;
}
public Session createSession(String id, int sessionTimeout)
{
LOG.debug("Begin to create session id = {}", id);
final Session s = new Session(id, sessionTimeout);
sessionMap.put(id, s);
return s;
}
/**
* addCallbackToSession
* @param s Session
* @param callback ICallback
*/
public void addCallbackToSession(Session s, ICallback callback)
{
if (callback != null && s != null)
{
if (s.getSessionTimeout() != 0)
{
sessionTime = s.getSessionTimeout();
}
Timeout t = timer.newTimeout(new SessionTimeoutHandler(this, callback, s), sessionTime, TimeUnit.SECONDS);
this.timerMap.put(s.getId(), t);
}
}
/**
* 删除一个Session (如果这个Session在创建的时候指定了callback,这里会删除定时器)
* @param id sessionId
* @return 要删除的session
* @see [类、类#方法、类#成员]
*/
public Object removeSession(String id)
{
LOG.debug("Begin to remove session id = {}", id);
final Session s = sessionMap.remove(id);
final Timeout timeout = timerMap.remove(id);
if (null != timeout)
{
timeout.cancel();
}
if (s != null)
{
return s.obj1;
}
else
{
return null;
}
}
public String getStatInfo()
{
return "SessionManager, sessionMap size:" + sessionMap.size() + ", timerMap size:" + timerMap.size();
}
}