You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ja...@apache.org on 2014/08/28 10:05:50 UTC
svn commit: r1621088 -
/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/stats/ServerHitBin.java
Author: jacopoc
Date: Thu Aug 28 08:05:50 2014
New Revision: 1621088
URL: http://svn.apache.org/r1621088
Log:
Completed the work to make the ServerHitBin class thread safe.
Modified:
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/stats/ServerHitBin.java
Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/stats/ServerHitBin.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/stats/ServerHitBin.java?rev=1621088&r1=1621087&r2=1621088&view=diff
==============================================================================
--- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/stats/ServerHitBin.java (original)
+++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/stats/ServerHitBin.java Thu Aug 28 08:05:50 2014
@@ -19,14 +19,13 @@
package org.ofbiz.webapp.stats;
import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.Deque;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedDeque;
+import java.util.concurrent.ConcurrentMap;
import javax.servlet.http.HttpServletRequest;
-import javolution.util.FastList;
-import javolution.util.FastMap;
-
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilHttp;
import org.ofbiz.base.util.UtilMisc;
@@ -58,18 +57,18 @@ public class ServerHitBin {
private static final String[] typeIds = {"", "REQUEST", "EVENT", "VIEW", "ENTITY", "SERVICE"};
// these Maps contain Lists of ServerHitBin objects by id, the most recent is first in the list
- public static Map<String, List<ServerHitBin>> requestHistory = FastMap.newInstance();
- public static Map<String, List<ServerHitBin>> eventHistory = FastMap.newInstance();
- public static Map<String, List<ServerHitBin>> viewHistory = FastMap.newInstance();
- public static Map<String, List<ServerHitBin>> entityHistory = FastMap.newInstance();
- public static Map<String, List<ServerHitBin>> serviceHistory = FastMap.newInstance();
+ public static final ConcurrentMap<String, Deque<ServerHitBin>> requestHistory = new ConcurrentHashMap<String, Deque<ServerHitBin>>();
+ public static final ConcurrentMap<String, Deque<ServerHitBin>> eventHistory = new ConcurrentHashMap<String, Deque<ServerHitBin>>();
+ public static final ConcurrentMap<String, Deque<ServerHitBin>> viewHistory = new ConcurrentHashMap<String, Deque<ServerHitBin>>();
+ public static final ConcurrentMap<String, Deque<ServerHitBin>> entityHistory = new ConcurrentHashMap<String, Deque<ServerHitBin>>();
+ public static final ConcurrentMap<String, Deque<ServerHitBin>> serviceHistory = new ConcurrentHashMap<String, Deque<ServerHitBin>>();
// these Maps contain ServerHitBin objects by id
- public static Map<String, ServerHitBin> requestSinceStarted = FastMap.newInstance();
- public static Map<String, ServerHitBin> eventSinceStarted = FastMap.newInstance();
- public static Map<String, ServerHitBin> viewSinceStarted = FastMap.newInstance();
- public static Map<String, ServerHitBin> entitySinceStarted = FastMap.newInstance();
- public static Map<String, ServerHitBin> serviceSinceStarted = FastMap.newInstance();
+ public static final ConcurrentMap<String, ServerHitBin> requestSinceStarted = new ConcurrentHashMap<String, ServerHitBin>();
+ public static final ConcurrentMap<String, ServerHitBin> eventSinceStarted = new ConcurrentHashMap<String, ServerHitBin>();
+ public static final ConcurrentMap<String, ServerHitBin> viewSinceStarted = new ConcurrentHashMap<String, ServerHitBin>();
+ public static final ConcurrentMap<String, ServerHitBin> entitySinceStarted = new ConcurrentHashMap<String, ServerHitBin>();
+ public static final ConcurrentMap<String, ServerHitBin> serviceSinceStarted = new ConcurrentHashMap<String, ServerHitBin>();
public static void countRequest(String id, HttpServletRequest request, long startTime, long runningTime, GenericValue userLogin) {
countHit(id, REQUEST, request, startTime, runningTime, userLogin);
@@ -147,7 +146,7 @@ public class ServerHitBin {
String id = makeIdTenantAware(baseId, delegator);
ServerHitBin bin = null;
- List<ServerHitBin> binList = null;
+ Deque<ServerHitBin> binList = null;
switch (type) {
case REQUEST:
@@ -172,69 +171,38 @@ public class ServerHitBin {
}
if (binList == null) {
- synchronized (ServerHitBin.class) {
- switch (type) {
- case REQUEST:
- binList = requestHistory.get(id);
- break;
-
- case EVENT:
- binList = eventHistory.get(id);
- break;
-
- case VIEW:
- binList = viewHistory.get(id);
- break;
-
- case ENTITY:
- binList = entityHistory.get(id);
- break;
-
- case SERVICE:
- binList = serviceHistory.get(id);
- break;
- }
- if (binList == null) {
- binList = FastList.newInstance();
- switch (type) {
- case REQUEST:
- requestHistory.put(id, binList);
- break;
-
- case EVENT:
- eventHistory.put(id, binList);
- break;
-
- case VIEW:
- viewHistory.put(id, binList);
- break;
-
- case ENTITY:
- entityHistory.put(id, binList);
- break;
-
- case SERVICE:
- serviceHistory.put(id, binList);
- break;
- }
- }
+ binList = new ConcurrentLinkedDeque<ServerHitBin>();
+ Deque<ServerHitBin> listFromMap = null;
+ switch (type) {
+ case REQUEST:
+ listFromMap = requestHistory.putIfAbsent(id, binList);
+ break;
+
+ case EVENT:
+ listFromMap = eventHistory.putIfAbsent(id, binList);
+ break;
+
+ case VIEW:
+ listFromMap = viewHistory.putIfAbsent(id, binList);
+ break;
+
+ case ENTITY:
+ listFromMap = entityHistory.putIfAbsent(id, binList);
+ break;
+
+ case SERVICE:
+ listFromMap = serviceHistory.putIfAbsent(id, binList);
+ break;
+ }
+ binList = listFromMap != null ? listFromMap : binList;
+ }
+
+ do {
+ bin = binList.peek();
+ if (bin == null) {
+ binList.addFirst(new ServerHitBin(id, type, true, delegator));
}
- }
-
- if (binList.size() > 0) {
- bin = binList.get(0);
- }
- if (bin == null) {
- synchronized (ServerHitBin.class) {
- if (binList.size() > 0) {
- bin = binList.get(0);
- }
- if (bin == null) {
- bin = new ServerHitBin(id, type, true, delegator);
- binList.add(0, bin);
- }
- }
- }
+ } while (bin == null);
long toTime = startTime + runningTime;
// advance the bin
@@ -266,10 +234,10 @@ public class ServerHitBin {
}
}
} else {
- binList.remove(0);
+ binList.pollFirst();
}
bin = new ServerHitBin(bin, bin.endTime + 1);
- binList.add(0, bin);
+ binList.addFirst(bin);
}
bin.addHit(runningTime);
@@ -302,7 +270,6 @@ public class ServerHitBin {
private static void countHitSinceStart(String id, int type, long runningTime, Delegator delegator) {
ServerHitBin bin = null;
- // save in global, and try to get bin by id
switch (type) {
case REQUEST:
bin = requestSinceStarted.get(id);
@@ -326,56 +293,31 @@ public class ServerHitBin {
}
if (bin == null) {
- synchronized (ServerHitBin.class) {
- switch (type) {
- case REQUEST:
- bin = requestSinceStarted.get(id);
- break;
-
- case EVENT:
- bin = eventSinceStarted.get(id);
- break;
-
- case VIEW:
- bin = viewSinceStarted.get(id);
- break;
-
- case ENTITY:
- bin = entitySinceStarted.get(id);
- break;
-
- case SERVICE:
- bin = serviceSinceStarted.get(id);
- break;
- }
-
- if (bin == null) {
- bin = new ServerHitBin(id, type, false, delegator);
- switch (type) {
- case REQUEST:
- requestSinceStarted.put(id, bin);
- break;
-
- case EVENT:
- eventSinceStarted.put(id, bin);
- break;
-
- case VIEW:
- viewSinceStarted.put(id, bin);
- break;
-
- case ENTITY:
- entitySinceStarted.put(id, bin);
- break;
-
- case SERVICE:
- serviceSinceStarted.put(id, bin);
- break;
- }
- }
+ bin = new ServerHitBin(id, type, false, delegator);
+ ServerHitBin binFromMap = null;
+ switch (type) {
+ case REQUEST:
+ binFromMap = requestSinceStarted.putIfAbsent(id, bin);
+ break;
+
+ case EVENT:
+ binFromMap = eventSinceStarted.putIfAbsent(id, bin);
+ break;
+
+ case VIEW:
+ binFromMap = viewSinceStarted.putIfAbsent(id, bin);
+ break;
+
+ case ENTITY:
+ binFromMap = entitySinceStarted.putIfAbsent(id, bin);
+ break;
+
+ case SERVICE:
+ binFromMap = serviceSinceStarted.putIfAbsent(id, bin);
+ break;
}
+ bin = binFromMap != null ? binFromMap : bin;
}
-
bin.addHit(runningTime);
}