/* *************************************************************************************** * 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.regression.nwtable; import com.espertech.esper.client.Configuration; import com.espertech.esper.client.EPServiceProvider; import com.espertech.esper.client.EPServiceProviderManager; import com.espertech.esper.client.scopetest.SupportUpdateListener; import com.espertech.esper.supportregression.bean.SupportBean; import com.espertech.esper.supportregression.bean.SupportBean_S0; import com.espertech.esper.supportregression.client.SupportConfigFactory; import junit.framework.TestCase; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.LinkedBlockingDeque; public class TestTableMTGroupedAccessReadIntoTableWriteNewRowCreation extends TestCase { private static final Logger log = LoggerFactory.getLogger(TestTableMTGroupedAccessReadIntoTableWriteNewRowCreation.class); private EPServiceProvider epService; public void setUp() { Configuration config = SupportConfigFactory.getConfiguration(); config.addEventType("SupportBean", SupportBean.class); config.addEventType("SupportBean_S0", SupportBean_S0.class); epService = EPServiceProviderManager.getDefaultProvider(config); epService.initialize(); } /** * Table: * create table varTotal (key string primary key, total sum(int)); * * For a given number of events * - Single writer expands the group-key space by sending additional keys. * - Single reader against a last-inserted group gets the non-zero-value. */ public void testMT() throws Exception { tryMT(10000); } private void tryMT(int numEvents) throws Exception { String epl = "create table varTotal (key string primary key, total sum(int));\n" + "into table varTotal select theString, sum(intPrimitive) as total from SupportBean group by theString;\n" + "@Name('listen') select varTotal[p00].total as c0 from SupportBean_S0;\n"; epService.getEPAdministrator().getDeploymentAdmin().parseDeploy(epl); epService.getEPRuntime().sendEvent(new SupportBean("A", 10)); LinkedBlockingDeque<String> queueCreated = new LinkedBlockingDeque<String>(); WriteRunnable writeRunnable = new WriteRunnable(epService, numEvents, queueCreated); ReadRunnable readRunnable = new ReadRunnable(epService, numEvents, queueCreated); // start Thread t1 = new Thread(writeRunnable); Thread t2 = new Thread(readRunnable); t1.start(); t2.start(); // join log.info("Waiting for completion"); t1.join(); t2.join(); assertNull(writeRunnable.getException()); assertNull(readRunnable.getException()); } public static class WriteRunnable implements Runnable { private final EPServiceProvider epService; private final int numEvents; private final LinkedBlockingDeque<String> queueCreated; private RuntimeException exception; public WriteRunnable(EPServiceProvider epService, int numEvents, LinkedBlockingDeque<String> queueCreated) { this.epService = epService; this.numEvents = numEvents; this.queueCreated = queueCreated; } public void run() { log.info("Started event send for write"); try { for (int i = 0; i < numEvents; i++) { String key = "E" + i; epService.getEPRuntime().sendEvent(new SupportBean(key, 10)); queueCreated.add(key); } } catch (RuntimeException ex) { log.error("Exception encountered: " + ex.getMessage(), ex); exception = ex; } log.info("Completed event send for write"); } public RuntimeException getException() { return exception; } } public static class ReadRunnable implements Runnable { private final EPServiceProvider epService; private final int numEvents; private final LinkedBlockingDeque<String> queueCreated; private RuntimeException exception; public ReadRunnable(EPServiceProvider epService, int numEvents, LinkedBlockingDeque<String> queueCreated) { this.epService = epService; this.numEvents = numEvents; this.queueCreated = queueCreated; } public void run() { log.info("Started event send for read"); SupportUpdateListener listener = new SupportUpdateListener(); epService.getEPAdministrator().getStatement("listen").addListener(listener); try { String currentEventId = "A"; for (int i = 0; i < numEvents; i++) { if (!queueCreated.isEmpty()) { currentEventId = queueCreated.removeFirst(); } epService.getEPRuntime().sendEvent(new SupportBean_S0(0, currentEventId)); int value = (Integer) listener.assertOneGetNewAndReset().get("c0"); assertEquals(10, value); } } catch (RuntimeException ex) { log.error("Exception encountered: " + ex.getMessage(), ex); exception = ex; } log.info("Completed event send for read"); } public RuntimeException getException() { return exception; } } }