Esempio n. 1
0
 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);
     }
 }
Esempio n. 2
0
        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);
                }
            }
        }
Esempio n. 3
0
        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);
                }
            }
        }
Esempio n. 4
0
        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();
            }
        }