You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by jb...@apache.org on 2009/10/08 18:22:49 UTC

svn commit: r823221 - in /geronimo/sandbox/jbohn/daytrader-bp: assemblies/web/daytrader-web-jdbc/src/main/webapp/ modules/core/src/main/java/org/apache/geronimo/samples/daytrader/core/

Author: jbohn
Date: Thu Oct  8 16:22:49 2009
New Revision: 823221

URL: http://svn.apache.org/viewvc?rev=823221&view=rev
Log:
include the MarketSummary cache function that was previously in TradeAction and now lives in TradeServicesManagerImpl

Modified:
    geronimo/sandbox/jbohn/daytrader-bp/assemblies/web/daytrader-web-jdbc/src/main/webapp/marketSummary.jsp
    geronimo/sandbox/jbohn/daytrader-bp/modules/core/src/main/java/org/apache/geronimo/samples/daytrader/core/TradeServicesManager.java
    geronimo/sandbox/jbohn/daytrader-bp/modules/core/src/main/java/org/apache/geronimo/samples/daytrader/core/TradeServicesManagerImpl.java

Modified: geronimo/sandbox/jbohn/daytrader-bp/assemblies/web/daytrader-web-jdbc/src/main/webapp/marketSummary.jsp
URL: http://svn.apache.org/viewvc/geronimo/sandbox/jbohn/daytrader-bp/assemblies/web/daytrader-web-jdbc/src/main/webapp/marketSummary.jsp?rev=823221&r1=823220&r2=823221&view=diff
==============================================================================
--- geronimo/sandbox/jbohn/daytrader-bp/assemblies/web/daytrader-web-jdbc/src/main/webapp/marketSummary.jsp (original)
+++ geronimo/sandbox/jbohn/daytrader-bp/assemblies/web/daytrader-web-jdbc/src/main/webapp/marketSummary.jsp Thu Oct  8 16:22:49 2009
@@ -24,9 +24,8 @@
 if (tradeServicesManager == null) {
     tradeServicesManager = TradeServiceUtilities.getTradeServicesManager();
 }
-TradeServices tradeServices = tradeServicesManager.getTradeServices();
 
-MarketSummaryDataBean marketSummaryData = tradeServices.getMarketSummary();
+MarketSummaryDataBean marketSummaryData = tradeServicesManager.getMarketSummary();
 %>
 <TABLE border="1" bgcolor="#ffffff" width="100%"
 	style="font-size: smaller">

Modified: geronimo/sandbox/jbohn/daytrader-bp/modules/core/src/main/java/org/apache/geronimo/samples/daytrader/core/TradeServicesManager.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/jbohn/daytrader-bp/modules/core/src/main/java/org/apache/geronimo/samples/daytrader/core/TradeServicesManager.java?rev=823221&r1=823220&r2=823221&view=diff
==============================================================================
--- geronimo/sandbox/jbohn/daytrader-bp/modules/core/src/main/java/org/apache/geronimo/samples/daytrader/core/TradeServicesManager.java (original)
+++ geronimo/sandbox/jbohn/daytrader-bp/modules/core/src/main/java/org/apache/geronimo/samples/daytrader/core/TradeServicesManager.java Thu Oct  8 16:22:49 2009
@@ -48,9 +48,22 @@
     /**
       * Get the currently selected TradeDBServices
       */
-
     public TradeDBServices getTradeDBServices();
 
+    /**
+      * Compute and return a snapshot of the current market
+      * conditions.  This includes the TSIA - and index of the prive
+      * of the top 100 Trade stock quotes.  Ths openTSIA(the index
+      * at the open), The volune of shares traded, Top Stocks gain
+      * and loss.  Get the currently selected TradeDBServices
+      * 
+      * This is a special version of this function which will cache
+      * the results provided by TradeServices.
+      * 
+      * @return A snapshot of the current market summary
+      */
+    public MarketSummaryDataBean getMarketSummary() throws Exception;
+
 
 }   
 

Modified: geronimo/sandbox/jbohn/daytrader-bp/modules/core/src/main/java/org/apache/geronimo/samples/daytrader/core/TradeServicesManagerImpl.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/jbohn/daytrader-bp/modules/core/src/main/java/org/apache/geronimo/samples/daytrader/core/TradeServicesManagerImpl.java?rev=823221&r1=823220&r2=823221&view=diff
==============================================================================
--- geronimo/sandbox/jbohn/daytrader-bp/modules/core/src/main/java/org/apache/geronimo/samples/daytrader/core/TradeServicesManagerImpl.java (original)
+++ geronimo/sandbox/jbohn/daytrader-bp/modules/core/src/main/java/org/apache/geronimo/samples/daytrader/core/TradeServicesManagerImpl.java Thu Oct  8 16:22:49 2009
@@ -20,6 +20,7 @@
 import java.util.Iterator;
 import java.util.Map;
 
+import org.apache.geronimo.samples.daytrader.util.Log;
 import org.apache.geronimo.samples.daytrader.util.TradeConfig;
 import org.apache.geronimo.samples.daytrader.core.TradeServices;
 import org.apache.geronimo.samples.daytrader.core.TradeDBServices;
@@ -44,17 +45,16 @@
 
 public class TradeServicesManagerImpl implements TradeServicesManager {
 
-//    private Set tradeServicesSet = new HashSet();
     private Map<Integer, TradeServices> tradeServicesMap = new HashMap<Integer, TradeServices>();
-//    private Set tradeDBServicesSet = new HashSet();
     private Map<Integer, TradeDBServices> tradeDBServicesMap = new HashMap<Integer, TradeDBServices>();
-    private TradeServices tradeServices = null;
-    private TradeDBServices tradeDBServices = null;
-    private TradeServices tradeServicesJPA = null;
-    private TradeDBServices tradeDBServicesJPA = null;
     private int currentMode = TradeConfig.JDBC;
     private String test;
 
+    // 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();
+    
     /**
       * TradeServicesManagerImpl null constructor
       */
@@ -85,6 +85,7 @@
       */
     public void setTradeServices(TradeServices tradeServices)
     {
+//        System.out.println("@JAB TradeServicesManagerImpl.setTradeServices current size " + tradeServicesMap.size() + " adding ");
 //        System.out.println("@JAB TradeServicesManagerImpl.setTradeServices current size " + tradeServicesMap.size() + " adding " + tradeServices);
         tradeServicesMap.put(tradeServices.getMode(), tradeServices);
 //        System.out.println("@JAB TradeServicesManagerImpl.setTradeServices new size " + tradeServicesMap.size());
@@ -185,4 +186,83 @@
         }
 //        System.out.println("@JAB TradeServicesManagerImpl.unbindDBService new size " + tradeDBServicesMap.size());
     }
+
+    /**
+     * 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
+     * quotes The openTSIA ( the index at the open) The volume of shares traded,
+     * Top Stocks gain and loss
+     *
+     * @return A snapshot of the current market summary
+     */
+    private MarketSummaryDataBean getMarketSummaryInternal() throws Exception {
+        if (Log.doActionTrace()) {
+            Log.trace("TradeAction:getMarketSummaryInternal()");
+        }
+        MarketSummaryDataBean marketSummaryData = null;
+        marketSummaryData = tradeServicesMap.get(currentMode).getMarketSummary();
+        return marketSummaryData;
+    }
+
+
 }