public void StreamSeries(StreamingJob job) { if (config.GetType() == typeof(ARMASeriesConfig)) { var c = (ARMASeriesConfig)config; StreamSeries(job, c); } else if (config.GetType() == typeof(PFSeriesConfig)) { var c = (PFSeriesConfig)config; StreamSeries(job, c); } }
private void StreamSeries(StreamingJob job, ARMASeriesConfig c) { DateTime dtts = new DateTime(1000, 1, 1, 0, 0, 0, 0); for (long i = 0; true; i++) { job.Token.ThrowIfCancellationRequested(); double xt = 0.0; try { lock (seriesDict) xt = CalculateNextX(rnd, series, c); } catch (Exception ex) { Console.WriteLine(ex.Message + "\n" + ex.Source); } if (c.Export && i > c.Delay) { double outlierCandidate = rnd.NextDouble(); if (outlierCandidate < c.OutlierRatio3s) { xt = GenerateOutlier(rnd, xt, series.X, 3, 5); } else if (outlierCandidate < c.OutlierRatio2s) { xt = GenerateOutlier(rnd, xt, series.X, 2, 3); } // string timestamp = DateTime.Now.ToString(DATETIME_FORMAT); // v1 string timestamp = dtts.ToString(generatorConfig.DateTimeFormat); // v2 var msg = JsonConvert.SerializeObject(GenerateMessage(c, group, timestamp, xt)); job.Client.Publish(config.Topic, Encoding.UTF8.GetBytes(msg)); Thread.Sleep(c.Interval); dtts = dtts.AddMilliseconds(c.Interval); // v2 } else if (i > c.Delay) { Thread.Sleep(c.Interval); } } }
private void StreamSeries(StreamingJob job, PFSeriesConfig c) { DateTime dtts = new DateTime(1000, 1, 1, 0, 0, 0, 0); string fHead = $"PF({string.Join(",", c.Arguments)})"; Function f = ConfigurationParser.ParseFunction(fHead, c.Expression); for (long i = 0; true; i++) { job.Token.ThrowIfCancellationRequested(); double xt = 0.0; lock (seriesDict) xt = CalculateNextX(rnd, series, c, f, fHead, i); if (c.Export && i > c.Delay) { double outlierCandidate = rnd.NextDouble(); if (outlierCandidate < c.OutlierRatio3s) { xt = GenerateOutlier(rnd, xt, series.X, 3, 4); } else if (outlierCandidate < c.OutlierRatio2s) { xt = GenerateOutlier(rnd, xt, series.X, 2, 3); } // string timestamp = DateTime.Now.ToString(DATETIME_FORMAT); // v1 string timestamp = dtts.ToString(generatorConfig.DateTimeFormat); // v2 var msg = JsonConvert.SerializeObject(GenerateMessage(c, group, timestamp, xt)); job.Client.Publish(config.Topic, Encoding.UTF8.GetBytes(msg)); Thread.Sleep(c.Interval); dtts = dtts.AddMilliseconds(c.Interval); // v2 } else if (i > c.Delay) { Thread.Sleep(c.Interval); } } }
static void Stream(GeneratorConfig generatorConfig, string group, Dictionary <string, DoubleSeries> seriesDict, Dictionary <string, SeriesConfig> configDict, Random rnd) { var tasks = new List <Task>(); var tokenSource = new CancellationTokenSource(); var token = tokenSource.Token; foreach (var item in seriesDict) { var task = Task.Factory.StartNew(() => { MqttClient client = new MqttClient(generatorConfig.BrokerHostName); try { client.Connect(Guid.NewGuid().ToString()); var job = new StreamingJob() { Client = client, Token = token }; var generator = new DoubleSeriesGenerator(group, generatorConfig, seriesDict, rnd, item.Value, configDict[item.Key]); generator.StreamSeries(job); } finally { client.Disconnect(); } }, token); tasks.Add(task); } string input = null; bool completed = false; var sw = new Stopwatch(); sw.Start(); try { do { input = Reader.ReadLine(500); completed = Task.WaitAll(tasks.ToArray(), 10); if (sw.ElapsedMilliseconds > generatorConfig.Duration) { tokenSource.Cancel(); Task.WaitAll(tasks.ToArray()); completed = true; } } while (input == null && !completed); if (completed) { Console.WriteLine("\nGenerator's runtime is over. The generator calls it a night."); } else { tokenSource.Cancel(); Task.WaitAll(tasks.ToArray()); } } catch (AggregateException e) { Console.WriteLine("\nThe generator tasks has been cancelled. The generator rests."); } finally { tokenSource.Dispose(); } }