/* *************************************************************************************** * 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.transaction.sim; import com.espertech.esper.example.transaction.TxnEventA; import com.espertech.esper.example.transaction.TxnEventB; import com.espertech.esper.example.transaction.TxnEventBase; import com.espertech.esper.example.transaction.TxnEventC; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Random; /** * Generates events for a continuous stream of transactions. * Rules for generating events are coded in {@link #createNextTransaction()}. * * @author Hans Gilde */ public class TransactionEventSource extends EventSource { protected String currentTransactionID; protected Random random = RandomUtil.getNewInstance(); protected List<TxnEventBase> transactionEvents; protected Iterator<TxnEventBase> transactionIterator; protected int maxTrans; protected int numTrans; protected FieldGenerator fieldGenerator = new FieldGenerator(); /** * @param howManyTransactions How many transactions should events be generated for? */ public TransactionEventSource(int howManyTransactions) { maxTrans = howManyTransactions; } protected List<TxnEventBase> createNextTransaction() { List<TxnEventBase> t = new ArrayList<TxnEventBase>(); long beginningStamp = System.currentTimeMillis(); //skip event 1 with probability 1 in 5000 if (random.nextInt(5000) < 4998) { TxnEventA txnEventA = new TxnEventA(null, beginningStamp, fieldGenerator.getRandomCustomer()); t.add(txnEventA); } long e2Stamp = fieldGenerator.randomLatency(beginningStamp); //skip event 2 with probability 1 in 1000 if (random.nextInt(1000) < 998) { TxnEventB txnEventB = new TxnEventB(null, e2Stamp); t.add(txnEventB); } long e3Stamp = fieldGenerator.randomLatency(e2Stamp); //skip event 3 with probability 1 in 10000 if (random.nextInt(10000) < 9998) { TxnEventC txnEventC = new TxnEventC(null, e3Stamp, fieldGenerator.getRandomSupplier()); t.add(txnEventC); } else { log.debug(".createNextTransaction generated missing event"); } return t; } /** * @return Returns the maxTrans. */ public int getMaxTrans() { return maxTrans; } protected boolean hasNext() { if (numTrans < maxTrans) { return true; } else { return transactionIterator.hasNext(); } } protected TxnEventBase next() { if (transactionIterator != null && transactionIterator.hasNext()) { TxnEventBase m = transactionIterator.next(); m.setTransactionId(currentTransactionID); return m; } if (numTrans == maxTrans) { throw new IllegalStateException("There is no next element."); } //create a new transaction, with ID. numTrans++; int id = random.nextInt(); if (id < 0) { id = -1 * id; } currentTransactionID = new Integer(id).toString(); transactionEvents = createNextTransaction(); transactionIterator = transactionEvents.iterator(); return this.next(); } private static final Logger log = LoggerFactory.getLogger(TransactionEventSource.class); }