예제 #1
0
        public static void Connect()
        {
            var commandLineArgs = Environment.GetCommandLineArgs();

            _host = commandLineArgs.ElementAtOrDefault(2) ?? ".";

            (_tmCid, _userInfo, _serverFeatures, _stopEventHandle) = Tms.InitializeAsTaskWithoutSql(
                new TmOikTaskOptions
            {
                TraceName    = TraceName,
                TraceComment = TraceComment,
            },
                new TmInitializeOptions
            {
                ApplicationName = ApplicationName,
                Host            = _host,
                TmServer        = commandLineArgs.ElementAtOrDefault(1) ?? "TMS",
                User            = commandLineArgs.ElementAtOrDefault(3) ?? "",
                Password        = commandLineArgs.ElementAtOrDefault(4) ?? "",
            });

            CfsConnect();

            Tms.PrintMessage("Соединение с сервером установлено");
        }
예제 #2
0
        public Task StopAsync(CancellationToken cancellationToken)
        {
            _infr.TerminateTm();

            Tms.Terminate(_tmCid, _rbCid);

            return(Task.CompletedTask);
        }
예제 #3
0
        public override async Task StopAsync(CancellationToken cancellationToken)
        {
            _infr.TerminateTm();

            Tms.TerminateWithoutSql(_tmCid);

            Tms.PrintMessage("Задача будет закрыта");

            await base.StopAsync(cancellationToken);
        }
예제 #4
0
 protected override async Task ExecuteAsync(CancellationToken stoppingToken)
 {
     while (!stoppingToken.IsCancellationRequested)
     {
         if (await Task.Run(() => Tms.StopEventSignalDuringWait(_stopEventHandle, 1000), stoppingToken))
         {
             Tms.PrintMessage("Получено сообщение об остановке со стороны сервера");
             _applicationLifetime.StopApplication();
             break;
         }
     }
 }
예제 #5
0
        public static void Connect()
        {
            var commandLineArgs = Environment.GetCommandLineArgs();

            (_tmCid, _userInfo, _serverFeatures) = Tms.InitializeWithoutSql(new TmInitializeOptions
            {
                ApplicationName = ApplicationName,
                TmServer        = commandLineArgs.ElementAtOrDefault(1) ?? "TMS",
                Host            = commandLineArgs.ElementAtOrDefault(2) ?? ".",
                User            = commandLineArgs.ElementAtOrDefault(3) ?? "",
                Password        = commandLineArgs.ElementAtOrDefault(4) ?? "",
            });
        }
예제 #6
0
        public static void Main(string[] args)
        {
            // требуется для работы с кодировкой Win-1251
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            // устанавливаем соединение с сервером ОИК
            try
            {
                TmStartup.Connect();
            }
            catch (Exception ex)
            {
                Tms.PrintError(ex.Message);
                Environment.Exit(-1);
            }

            // .NET Generic Host
            CreateHostBuilder(args).Build().Run();
        }
예제 #7
0
        public async Task DoWork()
        {
            Tms.PrintDebug(_infr.TmUserInfo?.Name);
            Tms.PrintDebug(await _api.GetSystemTimeString());

            var ts = new TmStatus(20, 1, 1);
            var ti = new TmAnalog(20, 1, 1);

            await _api.UpdateTagPropertiesAndClassData(ts);

            await _api.UpdateStatus(ts);

            await _api.UpdateTagPropertiesAndClassData(ti);

            await _api.UpdateAnalog(ti);

            Tms.PrintDebug(ts);
            Tms.PrintDebug(ti);
        }
예제 #8
0
        private async Task Dispatch() // todo unit test
        {
            if (!await IsElixUpdated())
            {
                return;
            }

            var(newEvents, newElix) = await _api.GetCurrentEvents(_currentElix);

            if (newEvents == null)
            {
                return;
            }
            Tms.PrintDebug($"Обнаружены новые события: {newEvents.Count}. Начинается обработка");

            await Task.WhenAll(_workers.Select(h => h.FilterAndDoWork(newEvents)));

            _currentElix = newElix;
        }
예제 #9
0
        public static bool AddWorkers(this IServiceCollection services)
        {
            if (!Directory.Exists(ConfigsPath))
            {
                Tms.PrintError("Не найден каталог с файлами конфигурации");
                return(false);
            }

            var allWorkers = FindAllWorkers();

            var workersCount = 0;

            foreach (var file in Directory.GetFiles(ConfigsPath, "*.json"))
            {
                var name = Path.GetFileName(file);
                try
                {
                    var worker = CreateWorker(allWorkers, name, File.ReadAllText(file));
                    services.AddSingleton <IHostedService>(provider => worker.Initialize(provider.GetService <IOikDataApi>(),
                                                                                         provider.GetService <WorkerCache>()));

                    workersCount++;
                }
                catch (JsonException ex)
                {
                    Tms.PrintError($"Ошибка JSON при разборе файла {name}: {ex.Message}");
                }
                catch (Exception ex)
                {
                    Tms.PrintError($"Ошибка при разборе файла {name}: {ex.Message}");
                }
            }

            if (workersCount == 0)
            {
                Tms.PrintError("Не найдено ни одного файла конфигурации");
                return(false);
            }

            Tms.PrintMessage($"Всего файлов конфигурации: {workersCount}");
            return(true);
        }
        public async Task FilterAndDoWork(IReadOnlyCollection <TmEvent> tmEvents) // todo unit test
        {
            var suitableEvents = tmEvents.Where(ev => _filter.IsEventSuitable(ev))
                                 .ToList();

            if (suitableEvents.Count == 0)
            {
                Tms.PrintDebug($"Отсутствуют подходящие события для обработчика {_name}");
                return;
            }
            try
            {
                await DoWork(suitableEvents);

                Tms.PrintDebug($"Обработаны события для обработчика {_name}");
            }
            catch (Exception ex)
            {
                Tms.PrintError($"Ошибка при работе обработчика {_name}: {ex.Message}");
            }
        }
예제 #11
0
        private async Task <bool> LoadWorkers()
        {
            if (!Directory.Exists(ConfigsPath))
            {
                Tms.PrintError("Не найден каталог с файлами обработчиков событий");
                return(false);
            }

            var allWorkers = FindAllWorkers();

            foreach (var file in Directory.GetFiles(ConfigsPath, "*.json"))
            {
                var name = Path.GetFileName(file);
                try
                {
                    _workers.Add(await CreateWorker(allWorkers, name, File.ReadAllText(file)));
                }
                catch (JsonException ex)
                {
                    Tms.PrintError($"Ошибка JSON при разборе файла {name}: {ex.Message}");
                }
                catch (Exception ex)
                {
                    Tms.PrintError($"Ошибка при разборе файла {name}: {ex.Message}");
                }
            }

            if (_workers.Count == 0)
            {
                Tms.PrintError("Не найдено ни одного обработчика событий");
                return(false);
            }

            Tms.PrintMessage($"Всего обработчиков событий: {_workers.Count}");
            return(true);
        }
예제 #12
0
 protected void LogError(string message)
 {
     Tms.PrintError($"{_name}: {message}");
 }
예제 #13
0
 protected void LogDebug(string message)
 {
     Tms.PrintDebug($"{_name}: {message}");
 }