IDEMPIERE-2944 AP2-330 Web services logging. Access to csMap is not thread safe. ctxMap should not cache full context of previous service execution.

This commit is contained in:
Heng Sin Low 2018-07-23 15:52:58 +08:00
parent 817f23835c
commit 4c644268e1
1 changed files with 41 additions and 20 deletions

View File

@ -144,9 +144,9 @@ public class CompiereService {
public void disconnect() public void disconnect()
{ {
// TODO: create a thread that checks expired connected compiereservices and log them out // TODO: create a thread that checks expired connected compiereservices and log them out
if (! isExpired()) { if (isExpired()) {
// do not close, save session in cache synchronized (csMap) {
if (! csMap.containsValue(this)) { //save session in cache
String key = getKey(m_AD_Client_ID, String key = getKey(m_AD_Client_ID,
m_AD_Org_ID, m_AD_Org_ID,
m_userName, m_userName,
@ -155,11 +155,10 @@ public class CompiereService {
m_locale, m_locale,
m_password, m_password,
m_IPAddress); m_IPAddress);
csMap.put(key.toString(), this); if (csMap.containsKey(key)) {
Properties savedCache = new Properties(); csMap.remove(key.toString());
savedCache.putAll(Env.getCtx()); ctxMap.remove(key.toString());
ctxMap.put(key.toString(), savedCache); }
if (log.isLoggable(Level.INFO)) log.info("Saving " + this + " in cache");
} }
} }
} }
@ -315,6 +314,26 @@ public class CompiereService {
session.saveEx(); session.saveEx();
m_loggedin = true; m_loggedin = true;
synchronized (csMap) {
//save session in cache
String key = getKey(m_AD_Client_ID,
m_AD_Org_ID,
m_userName,
m_AD_Role_ID,
m_M_Warehouse_ID,
m_locale,
m_password,
m_IPAddress);
if (! csMap.containsKey(key)) {
csMap.put(key.toString(), this);
Properties savedCache = new Properties();
savedCache.putAll(Env.getCtx());
ctxMap.put(key.toString(), savedCache);
if (log.isLoggable(Level.INFO)) log.info("Saving " + this + " in cache");
}
}
return true; return true;
} }
@ -404,6 +423,7 @@ public class CompiereService {
loginRequest.getPass(), loginRequest.getPass(),
req.getRemoteAddr()); req.getRemoteAddr());
CompiereService l_cs = null; CompiereService l_cs = null;
synchronized (csMap) {
if (csMap.containsKey(key)) { if (csMap.containsKey(key)) {
l_cs = csMap.get(key); l_cs = csMap.get(key);
if (l_cs != null) { if (l_cs != null) {
@ -418,6 +438,7 @@ public class CompiereService {
} }
} }
} }
}
return l_cs; return l_cs;
} }