IDEMPIERE-4225 Do not cache MSession that's not thread safe

This commit is contained in:
hengsin 2020-04-01 17:12:51 +08:00
parent 21cad08cbb
commit 6e606799f9
1 changed files with 20 additions and 16 deletions

View File

@ -20,12 +20,11 @@ import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import java.util.Vector;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.Adempiere; import org.compiere.Adempiere;
import org.compiere.util.CCache;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Ini;
import org.compiere.util.TimeUtil; import org.compiere.util.TimeUtil;
import org.compiere.util.WebUtil; import org.compiere.util.WebUtil;
@ -58,16 +57,15 @@ public class MSession extends X_AD_Session
{ {
int AD_Session_ID = Env.getContextAsInt(ctx, "#AD_Session_ID"); int AD_Session_ID = Env.getContextAsInt(ctx, "#AD_Session_ID");
MSession session = null; MSession session = null;
if (AD_Session_ID > 0)
session = (MSession)s_sessions.get(Integer.valueOf(AD_Session_ID));
// Try to load // Try to load
if (session == null && AD_Session_ID > 0) if (AD_Session_ID > 0 && s_sessions.contains(AD_Session_ID))
{ {
session = new MSession(ctx, AD_Session_ID, null); session = new MSession(ctx, AD_Session_ID, null);
if (session.get_ID() != AD_Session_ID) { if (session.get_ID() != AD_Session_ID)
Env.setContext (ctx, "#AD_Session_ID", AD_Session_ID); {
session = null;
s_sessions.remove(AD_Session_ID);
} }
s_sessions.put(AD_Session_ID, session);
} }
// Create New // Create New
if (session == null && createNew) if (session == null && createNew)
@ -76,7 +74,7 @@ public class MSession extends X_AD_Session
session.saveEx(); session.saveEx();
AD_Session_ID = session.getAD_Session_ID(); AD_Session_ID = session.getAD_Session_ID();
Env.setContext (ctx, "#AD_Session_ID", AD_Session_ID); Env.setContext (ctx, "#AD_Session_ID", AD_Session_ID);
s_sessions.put (Integer.valueOf(AD_Session_ID), session); s_sessions.add (Integer.valueOf(AD_Session_ID));
} }
return session; return session;
} // get } // get
@ -93,23 +91,29 @@ public class MSession extends X_AD_Session
{ {
int AD_Session_ID = Env.getContextAsInt(ctx, "#AD_Session_ID"); int AD_Session_ID = Env.getContextAsInt(ctx, "#AD_Session_ID");
MSession session = null; MSession session = null;
if (AD_Session_ID > 0) // Try to load
session = (MSession)s_sessions.get(Integer.valueOf(AD_Session_ID)); if (AD_Session_ID > 0 && s_sessions.contains(AD_Session_ID))
{
session = new MSession(ctx, AD_Session_ID, null);
if (session.get_ID() != AD_Session_ID)
{
session = null;
s_sessions.remove(AD_Session_ID);
}
}
if (session == null) if (session == null)
{ {
session = new MSession (ctx, Remote_Addr, Remote_Host, WebSession, null); // remote session session = new MSession (ctx, Remote_Addr, Remote_Host, WebSession, null); // remote session
session.saveEx(); session.saveEx();
AD_Session_ID = session.getAD_Session_ID(); AD_Session_ID = session.getAD_Session_ID();
Env.setContext(ctx, "#AD_Session_ID", AD_Session_ID); Env.setContext(ctx, "#AD_Session_ID", AD_Session_ID);
s_sessions.put(Integer.valueOf(AD_Session_ID), session); s_sessions.add(Integer.valueOf(AD_Session_ID));
} }
return session; return session;
} // get } // get
/** Sessions */ /** Sessions */
private static CCache<Integer, MSession> s_sessions = Ini.isClient() private static Vector<Integer> s_sessions = new Vector<>();
? new CCache<Integer, MSession>(null, "AD_Session_ID", 1, 0, false) // one client session
: new CCache<Integer, MSession>(null, "AD_Session_ID", 30, 0, false); // no time-out
/************************************************************************** /**************************************************************************