package com.activequant.server.components; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Timer; import java.util.TimerTask; import com.activequant.component.ComponentBase; import com.activequant.domainmodel.ETransportType; import com.activequant.interfaces.transport.ITransportFactory; import com.activequant.interfaces.utils.IEventListener; import com.activequant.transport.activemq.ActiveMQTransportFactory; /** * * * @author GhostRider * */ public class SessionTrackerComponent extends ComponentBase { // private static Map<String, String> userSessionMap = new HashMap<String, String>(); private static Map<String, Long> userLastSeenMap = new HashMap<String, Long>(); // public static void main(String[] args) throws Exception { ITransportFactory t = new ActiveMQTransportFactory("localhost", 61616); new SessionTrackerComponent(t); } class PruneTask extends TimerTask { public void run() { // Long now = new Date().getTime(); Long sessionLifeTime = 15000L; Long pruneAge = (now - sessionLifeTime); Iterator<Entry<String, Long>> it = userLastSeenMap.entrySet() .iterator(); List<String> pruneList = new ArrayList<String>(); while (it.hasNext()) { // Entry<String, Long> entry = it.next(); if (entry.getValue() < pruneAge) { // pruneList.add(entry.getKey()); } // } for (String s : pruneList) { userLastSeenMap.remove(s); userSessionMap.remove(s); } } } // public SessionTrackerComponent(ITransportFactory transFac) throws Exception { super("SessionTracker", transFac); transFac.getReceiver(ETransportType.CONTROL, "SESSIONS").getRawEvent() .addEventListener(new IEventListener<byte[]>() { @Override public void eventFired(byte[] arg0) { // String uidIp = new String(arg0); if (uidIp.contains(";")) { String uid = uidIp.split(";")[0]; String ip = uidIp.split(";")[1]; SessionTrackerComponent.trackUserSession(uid, ip); // } } }); // regularly prune stale sessions. Timer timer = new Timer(); timer.schedule(new PruneTask(), 0, 5 * 1000); // } /** * Using null to signal. * * @param uid * @return */ public static String hasUserSession(String uid, String ip) { if (userSessionMap.containsKey(uid) && !userSessionMap.get(uid).equals(ip)) return userSessionMap.get(uid); return null; } // public static void trackUserSession(String uid, String ip) { userSessionMap.put(uid, ip); userLastSeenMap.put(uid, new Date().getTime()); } // @Override public String getDescription() { // return "The session tracker component keeps track of active user sessions."; } }