package org.cryptocoinpartners.module; import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import javax.inject.Singleton; import org.cryptocoinpartners.esper.annotation.When; import org.cryptocoinpartners.schema.Bar; import org.cryptocoinpartners.schema.BarFactory; import org.cryptocoinpartners.schema.Book; import org.cryptocoinpartners.schema.MarketData; import org.cryptocoinpartners.schema.Trade; import org.cryptocoinpartners.schema.dao.BarJpaDao; import org.cryptocoinpartners.schema.dao.BookJpaDao; import org.cryptocoinpartners.schema.dao.MarketDataJpaDao; import org.cryptocoinpartners.schema.dao.TradeJpaDao; import org.cryptocoinpartners.util.ConfigUtil; import org.cryptocoinpartners.util.EM; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.inject.Inject; /** * @author Tim Olson */ @Singleton public class SaveMarketData { private static ExecutorService tradeService; private static ExecutorService bookService; private static ExecutorService barService; static Future future; private static MarketData lastMktData = null; @Inject protected BarFactory barFactory; @Inject protected BookJpaDao bookDao; @Inject protected TradeJpaDao tradeDao; @Inject protected MarketDataJpaDao marketDataDao; @Inject protected BarJpaDao barDao; static { tradeService = Executors.newFixedThreadPool(ConfigUtil.combined().getInt("db.trade.writer.threads")); bookService = Executors.newFixedThreadPool(ConfigUtil.combined().getInt("db.book.writer.threads")); barService = Executors.newFixedThreadPool(ConfigUtil.combined().getInt("db.bar.writer.threads")); } //@When("select * from MarketData") // @When("select * from MarketData") @When("@Priority(1) select * from Book") public void handleBook(Book m) { // if (future == null || future.isDone()) { //Future future = log.trace("book recieved: " + m.getId() + " thread: " + Thread.currentThread().getName()); bookService.submit(new saveBookRunnable(m)); } @When("@Priority(1) select * from Trade") public void handleTrade(Trade m) { // if (future == null || future.isDone()) { //Future future = // log.debug("trade recieved: " + m.getId() + " thread: " + Thread.currentThread().getName()); log.trace("Trade recieved: " + m.getId() + " thread: " + Thread.currentThread().getName()); tradeService.submit(new saveTradeRunnable(m)); } @When("@Priority(1) select * from Bar") public void handleBar(Bar m) { // if (future == null || future.isDone()) { //Future future = // log.debug("bar recieved: " + m.getId() + " thread: " + Thread.currentThread().getName()); log.trace("Bar recieved: " + m.getId() + " thread: " + Thread.currentThread().getName()); barService.submit(new saveBarRunnable(m)); } public class saveTradeRunnable implements Runnable { Trade trade; @Override public void run() { saveData(); } public saveTradeRunnable(Trade m) { this.trade = m; } public void saveData() { // issues is when we have mutlipe thread persisting , we have persitance contect per thread that is not updated. Trade duplicate = (trade.getDao() == null) ? EM.queryZeroOne(Trade.class, "select t from Trade t where market=?1 and remoteKey=?2 and time=?3", trade.getMarket(), trade.getRemoteKey(), trade.getTime()) : trade.queryZeroOne(Trade.class, "select t from Trade t where market=?1 and remoteKey=?2 and time=?3", trade.getMarket(), trade.getRemoteKey(), trade.getTime()); if (duplicate == null) trade.persit(); } } public class saveBookRunnable implements Runnable { Book book; @Override public void run() { saveData(); } public saveBookRunnable(Book m) { this.book = m; } public void saveData() { UUID duplicate = null; if (book.getId() != null) duplicate = (book.getDao() == null) ? (EM.queryZeroOne(UUID.class, "select b.id from Book b where b.id=?1", book.getId())) : (book .queryZeroOne(UUID.class, "select b.id from Book b where b.id=?1", book.getId())); if (duplicate == null) { //try { // log.info("persiting book: " + book.getId()); book.persit(); } } } public class saveBarRunnable implements Runnable { Bar rawBar; @Override public void run() { saveData(); } public saveBarRunnable(Bar m) { this.rawBar = m; } public void saveData() { Bar bar = barFactory.create(rawBar); Bar duplicate = barDao.queryZeroOne(Bar.class, "select b from Bar b where b=?1", bar); if (duplicate == null) bar.persit(); } } protected static Logger log = LoggerFactory.getLogger("org.cryptocoinpartners.saveMarketData"); }