/* *************************************************************************************** * Copyright (C) 2006 EsperTech, Inc. All rights reserved. * * http://www.espertech.com/esper * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * *************************************************************************************** */ package com.espertech.esper.example.stockticker.monitor; import com.espertech.esper.client.EPServiceProvider; import com.espertech.esper.client.EPStatement; import com.espertech.esper.client.EventBean; import com.espertech.esper.client.UpdateListener; import com.espertech.esper.example.stockticker.eventbean.PriceLimit; import com.espertech.esper.example.stockticker.eventbean.StockTick; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class StockTickerMonitor { private final EPServiceProvider epService; private final StockTickerResultListener stockTickerResultListener; private PriceLimit limit = null; private EPStatement newLimitListener = null; private EPStatement initialPriceListener = null; private EPStatement lowPriceListener = null; private EPStatement highPriceListener = null; public StockTickerMonitor(EPServiceProvider epService, final StockTickerResultListener stockTickerResultListener) { this.epService = epService; this.stockTickerResultListener = stockTickerResultListener; // Listen to all limits to be set String expressionText = "every pricelimit=PriceLimit()"; EPStatement factory = epService.getEPAdministrator().createPattern(expressionText); factory.addListener(new UpdateListener() { public void update(EventBean[] newEvents, EventBean[] oldEvents) { PriceLimit limitBean = (PriceLimit) newEvents[0].get("pricelimit"); if (log.isDebugEnabled()) { log.debug(".update Received new limit, user=" + limitBean.getUserId() + " stock=" + limitBean.getStockSymbol() + " pct=" + limitBean.getLimitPct()); } new StockTickerMonitor(StockTickerMonitor.this.epService, limitBean, stockTickerResultListener); } }); } public StockTickerMonitor(EPServiceProvider epService, PriceLimit limit, final StockTickerResultListener stockTickerResultListener) { this.epService = epService; this.limit = limit; this.stockTickerResultListener = stockTickerResultListener; String expressionText = "every pricelimit=PriceLimit" + "(userId='" + limit.getUserId() + "'," + "stockSymbol='" + limit.getStockSymbol() + "')"; newLimitListener = epService.getEPAdministrator().createPattern(expressionText); newLimitListener.addListener(new UpdateListener() { public void update(EventBean[] newEvents, EventBean[] oldEvents) { if (log.isDebugEnabled()) { log.debug(".update Received an override limit, stopping listeners"); } die(); } }); expressionText = "tick=StockTick(stockSymbol='" + limit.getStockSymbol() + "')"; initialPriceListener = epService.getEPAdministrator().createPattern(expressionText); initialPriceListener.addListener(new UpdateListener() { public void update(EventBean[] newEvents, EventBean[] oldEvents) { StockTick tick = (StockTick) newEvents[0].get("tick"); PriceLimit limit = StockTickerMonitor.this.limit; initialPriceListener = null; double limitPct = limit.getLimitPct(); double upperLimit = tick.getPrice() * (1.0 + (limitPct / 100.0)); double lowerLimit = tick.getPrice() * (1.0 - (limitPct / 100.0)); if (log.isDebugEnabled()) { log.debug(".update Received initial tick, stock=" + tick.getStockSymbol() + " price=" + tick.getPrice() + " limit.limitPct=" + limitPct + " lowerLimit=" + lowerLimit + " upperLimit=" + upperLimit); } StockTickerAlertListener listener = new StockTickerAlertListener(StockTickerMonitor.this.epService, limit, tick, stockTickerResultListener); String expressionText = "every tick=StockTick" + "(stockSymbol='" + limit.getStockSymbol() + "', price < " + lowerLimit + ")"; lowPriceListener = StockTickerMonitor.this.epService.getEPAdministrator().createPattern(expressionText); lowPriceListener.addListener(listener); expressionText = "every tick=StockTick" + "(stockSymbol='" + limit.getStockSymbol() + "', price > " + upperLimit + ")"; highPriceListener = StockTickerMonitor.this.epService.getEPAdministrator().createPattern(expressionText); highPriceListener.addListener(listener); } }); } private void die() { if (newLimitListener != null) newLimitListener.removeAllListeners(); if (initialPriceListener != null) initialPriceListener.removeAllListeners(); if (lowPriceListener != null) lowPriceListener.removeAllListeners(); if (highPriceListener != null) highPriceListener.removeAllListeners(); } private static final Logger log = LoggerFactory.getLogger(StockTickerMonitor.class); }