Esempio n. 1
0
        private void PerformMultithreadedTest(FilterHandleSetNode topNode,
                                              int numberOfThreads,
                                              int numberOfRunnables,
                                              int numberOfSecondsSleep)
        {
            Log.Info(".performMultithreadedTest Loading thread pool work queue,numberOfRunnables=" + numberOfRunnables);

            var pool = new DedicatedExecutorService("test", numberOfThreads, new ImperfectBlockingQueue <Runnable>());

            for (var i = 0; i < numberOfRunnables; i++)
            {
                var runnable = new IndexTreeBuilderRunnable(_eventType, topNode, _testFilterSpecs, _matchedEvents, _unmatchedEvents);
                pool.Submit(runnable.Run);
            }

            Log.Info(".performMultithreadedTest Starting thread pool, threads=" + numberOfThreads);

            // Sleep X seconds
            Sleep(numberOfSecondsSleep);

            Log.Info(".performMultithreadedTest Completed, numberOfRunnables=" + numberOfRunnables +
                     "  numberOfThreads=" + numberOfThreads +
                     "  completed=" + pool.NumExecuted);

            pool.Shutdown();
            pool.AwaitTermination(TimeSpan.FromSeconds(1));

            Assert.AreEqual(pool.NumExecuted, numberOfRunnables);
        }
        public void PerformTest(int numberOfThreads,
                                int numberOfTicksToSend,
                                int ratioPriceOutOfLimit,
                                int numberOfSecondsWaitForCompletion)
        {
            var totalNumTicks = numberOfTicksToSend + 2 * TestStockTickerGenerator.NUM_STOCK_NAMES;

            Log.Info(
                ".performTest Generating data, numberOfTicksToSend=" +
                numberOfTicksToSend +
                "  ratioPriceOutOfLimit=" +
                ratioPriceOutOfLimit);

            var generator = new StockTickerEventGenerator();
            var stream    = generator.MakeEventStream(
                numberOfTicksToSend,
                ratioPriceOutOfLimit,
                TestStockTickerGenerator.NUM_STOCK_NAMES,
                PRICE_LIMIT_PCT_LOWER_LIMIT,
                PRICE_LIMIT_PCT_UPPER_LIMIT,
                PRICE_LOWER_LIMIT,
                PRICE_UPPER_LIMIT,
                true);

            var eventService = _runtime.EventService;

            Log.Info(".performTest Send limit and initial tick events - singlethreaded");
            for (var i = 0; i < TestStockTickerGenerator.NUM_STOCK_NAMES * 2; i++)
            {
                var @event = stream.First();
                stream.RemoveAt(0);
                eventService.SendEventBean(@event, @event.GetType().Name);
            }

            Log.Info(".performTest Loading thread pool work queue, numberOfRunnables=" + stream.Count);

            var executorService = new DedicatedExecutorService(string.Empty, numberOfThreads, new LinkedBlockingQueue <Runnable>());

            foreach (var @event in stream)
            {
                var innerEvent = @event;
                executorService.Submit(() => eventService.SendEventBean(
                                           innerEvent, innerEvent.GetType().Name));
            }

            Log.Info(".performTest Listening for completion");
            EPRuntimeUtil.AwaitCompletion(_runtime, totalNumTicks, numberOfSecondsWaitForCompletion, 1, 10);

            executorService.Shutdown();

            // Check results : make sure the given ratio of out-of-limit stock prices was reported
            var expectedNumEmitted = numberOfTicksToSend / ratioPriceOutOfLimit + 1;

            Assert.IsTrue(_listener.Count == expectedNumEmitted);

            Log.Info(".performTest Done test");
        }
Esempio n. 3
0
        private void TryIterate(int numThreads, int numRepeats)
        {
            var callList = CompatExtensions.XRange(0, numThreads)
                           .Select(ii => new StmtNamedWindowQueryCallable(Convert.ToString(ii), _engine, numRepeats))
                           .ToList();

            var threadPool    = new DedicatedExecutorService("test", numThreads);
            var threadFutures = callList
                                .Select(threadPool.Submit)
                                .ToList();

            threadPool.Shutdown();
            threadPool.AwaitTermination(new TimeSpan(0, 0, 10));

            Thread.Sleep(100);

            threadFutures.ForEach(
                future => Assert.IsTrue(future.GetValueOrDefault()));
        }
        private void TryStatementListenerAddRemove(int numThreads, EPStatement statement, bool isEPL, int numRepeats)
        {
            var threadPool = new DedicatedExecutorService("test", numThreads);
            var future     = new Future <bool> [numThreads];

            for (int i = 0; i < numThreads; i++)
            {
                var callable = new StmtListenerAddRemoveCallable(_engine, statement, isEPL, numRepeats);
                future[i] = threadPool.Submit(callable);
            }

            threadPool.Shutdown();
            threadPool.AwaitTermination(new TimeSpan(0, 0, 30));

            for (int i = 0; i < numThreads; i++)
            {
                Assert.IsTrue(future[i].GetValueOrDefault(), "Failed stmt=" + statement.Text);
            }
        }
Esempio n. 5
0
        public void Run()
        {
            if (_isWaitKeypress)
            {
                Console.WriteLine("...press enter to start simulation...");
                Console.ReadKey();
            }

            // Configure engine with event names to make the statements more readable.
            // This could also be done in a configuration file.
            Configuration configuration = new Configuration();
            configuration.AddEventType("MarketDataEvent", typeof(MarketDataEvent).FullName);

            // Get engine instance
            EPServiceProvider epService = EPServiceProviderManager.GetProvider(_engineURI, configuration);

            // Set up statements
            var tickPerSecStmt = TicksPerSecondStatement.Create(epService.EPAdministrator);
            tickPerSecStmt.Events += LogRate;

            var falloffStmt = TicksFalloffStatement.Create(epService.EPAdministrator);
            falloffStmt.Events += MonitorRate;

            // Send events
            var threadPool = new DedicatedExecutorService(string.Empty, _numberOfThreads);
            MarketDataSendRunnable[] runnables = new MarketDataSendRunnable[_numberOfThreads];
            for (int i = 0; i < _numberOfThreads; i++)
            {
                runnables[i] = new MarketDataSendRunnable(epService);
                threadPool.Submit(runnables[i].Run);
            }

            int seconds = 0;
            Random random = new Random();
            while (seconds < _numSeconds)
            {
                seconds++;
                Thread.Sleep(1000);

                FeedEnum? feedToDropOff;
                if (random.NextDouble() * 100 < _dropProbability)
                {
                    feedToDropOff = FeedEnum.FEED_A;
                    if (random.Next(0, 2) == 1)
                    {
                        feedToDropOff = FeedEnum.FEED_B;
                    }
                    Log.Info("Setting drop-off for feed {0}", feedToDropOff);
                }
                else
                {
                    feedToDropOff = null;
                }
                
                foreach (MarketDataSendRunnable t in runnables) 
                {
                    t.SetRateDropOffFeed(feedToDropOff);
                }
            }

            Log.Info("Shutting down threadpool");
            for (int i = 0; i < runnables.Length; i++)
            {
                runnables[i].SetShutdown();
            }
            threadPool.Shutdown();
            threadPool.AwaitTermination(new TimeSpan(0, 0, 0, 10));
        }