You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ho...@apache.org on 2007/10/10 03:50:07 UTC

svn commit: r583341 - in /geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader: TradeAction.java direct/TradeDirect.java

Author: hogstrom
Date: Tue Oct  9 18:50:06 2007
New Revision: 583341

URL: http://svn.apache.org/viewvc?rev=583341&view=rev
Log:
Corrected MarketSummary Caching.  I had originally put the cache in TradeDirect for testing.  It needed to be moved to TradeAction so all runtime modes would benefit.

Modified:
    geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeAction.java
    geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/TradeDirect.java

Modified: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeAction.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeAction.java?rev=583341&r1=583340&r2=583341&view=diff
==============================================================================
--- geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeAction.java (original)
+++ geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeAction.java Tue Oct  9 18:50:06 2007
@@ -36,6 +36,11 @@
  * making calls to TradeAction methods to actually performance each operation.
  */
 public class TradeAction implements TradeServices {
+    // This lock is used to serialize market summary operations.
+    private static final Integer marketSummaryLock = new Integer(0);
+    private static long nextMarketSummary = System.currentTimeMillis();
+    private static MarketSummaryDataBean cachedMSDB = MarketSummaryDataBean.getRandomInstance();
+    
     // make this static so the trade impl can be cached
     // - ejb3 mode is the only thing that really uses this
     // - can go back and update other modes to take advantage (ie. TradeDirect)
@@ -102,6 +107,67 @@
         }
     }
 
+
+    /**
+     * Market Summary is inherently a heavy database operation.  For servers that have a caching
+     * story this is a great place to cache data that is good for a period of time.  In order to
+     * provide a flexible framework for this we allow the market summary operation to be
+     * invoked on every transaction, time delayed or never.  This is configurable in the 
+     * configuration panel.  
+     *
+     * @return An instance of the market summary
+     */
+    public MarketSummaryDataBean getMarketSummary() throws Exception {
+    
+        if (Log.doActionTrace()) {
+            Log.trace("TradeAction:getMarketSummary()");
+        }
+    
+        if (TradeConfig.getMarketSummaryInterval() == 0) return getMarketSummaryInternal();
+        if (TradeConfig.getMarketSummaryInterval() < 0) return cachedMSDB;
+    
+        /**
+         * This is a little funky.  If its time to fetch a new Market summary then we'll synchronize
+         * access to make sure only one requester does it.  Others will merely return the old copy until
+         * the new MarketSummary has been executed.
+         */
+         long currentTime = System.currentTimeMillis();
+         
+         if (currentTime > nextMarketSummary) {
+             long oldNextMarketSummary = nextMarketSummary;
+             boolean fetch = false;
+
+             synchronized (marketSummaryLock) {
+                 /**
+                  * Is it still ahead or did we miss lose the race?  If we lost then let's get out
+                  * of here as the work has already been done.
+                  */
+                 if (oldNextMarketSummary == nextMarketSummary) {
+                     fetch = true;
+                     nextMarketSummary += TradeConfig.getMarketSummaryInterval()*1000;
+                     
+                     /** 
+                      * If the server has been idle for a while then its possible that nextMarketSummary
+                      * could be way off.  Rather than try and play catch up we'll simply get in sync with the 
+                      * current time + the interval.
+                      */ 
+                     if (nextMarketSummary < currentTime) {
+                         nextMarketSummary = currentTime + TradeConfig.getMarketSummaryInterval()*1000;
+                     }
+                 }
+             }
+
+            /**
+             * If we're the lucky one then let's update the MarketSummary
+             */
+            if (fetch) {
+                cachedMSDB = getMarketSummaryInternal();
+            }
+        }
+         
+        return cachedMSDB;
+    }
+
     /**
      * Compute and return a snapshot of the current market conditions This
      * includes the TSIA - an index of the price of the top 100 Trade stock
@@ -110,9 +176,9 @@
      *
      * @return A snapshot of the current market summary
      */
-    public MarketSummaryDataBean getMarketSummary() throws Exception {
+    public MarketSummaryDataBean getMarketSummaryInternal() throws Exception {
         if (Log.doActionTrace()) {
-            Log.trace("TradeAction:getMarketSummary()");
+            Log.trace("TradeAction:getMarketSummaryInternal()");
         }
         MarketSummaryDataBean marketSummaryData = null;
         marketSummaryData = trade.getMarketSummary();

Modified: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/TradeDirect.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/TradeDirect.java?rev=583341&r1=583340&r2=583341&view=diff
==============================================================================
--- geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/TradeDirect.java (original)
+++ geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/TradeDirect.java Tue Oct  9 18:50:06 2007
@@ -59,11 +59,6 @@
 public class TradeDirect implements TradeServices
 
 {
-	// This lock is used to serialize market summary operations.
-	private static Integer marketSummaryLock = new Integer(0);
-	private static long nextMarketSummary = 0;
-	private static MarketSummaryDataBean cachedMSDB = MarketSummaryDataBean.getRandomInstance();
-
 	private static String dsName = TradeConfig.DATASOURCE;
 
 	private static DataSource datasource = null;
@@ -89,42 +84,10 @@
 		this.inSession = inSession;
 	}
 
-	/**
+    /**
      * @see TradeServices#getMarketSummary()
      */
 	public MarketSummaryDataBean getMarketSummary() throws Exception {
-		boolean fetch = false;
-		if (TradeConfig.getMarketSummaryInterval() == 0) return getMarketSummaryInternal();
-		if (TradeConfig.getMarketSummaryInterval() < 0) return cachedMSDB;
-		
-		/**
-		 * This is a little funky.  If its time to fetch a new Market summary then we'll synchronize
-		 * access to make sure only one requester does it.  Others will merely return the old copy until
-		 * the new MarketSummary has been executed.
-		 */
-		if (System.currentTimeMillis() > nextMarketSummary) {
-			synchronized (marketSummaryLock) {
-				if (System.currentTimeMillis() > nextMarketSummary)  fetch = true;
-				if (nextMarketSummary == 0) nextMarketSummary = System.currentTimeMillis();
-				nextMarketSummary += TradeConfig.getMarketSummaryInterval()*1000;
-			}
-
-			/**
-			 * If we're the lucky one reset the trap and get a new MarketSummaryObject.
-			 */
-			if (fetch) {
-				fetch = false;
-				cachedMSDB = getMarketSummaryInternal();
-			}
-		}
-		return cachedMSDB;
-	}
-
-
-	/**
-     * @see TradeServices#getMarketSummary()
-     */
-	public MarketSummaryDataBean getMarketSummaryInternal() throws Exception {
 
 		MarketSummaryDataBean marketSummaryData = null;
 		Connection conn = null;