@zanooda

Как научить сервер IIS выполнять проверки по таймеру?

Задача: сделать сайт который будет собирать новости с новостных ресурсов (нескольких конкретных) и показывать только самые последние новости (только за последний час, например). Если за час новостей не было - то на сайте будет отбражаться что "за час небыло никаких новостей".
Я использую платформу ASP.NET MVC и бесплатный хостинг на IIS. Для того что бы "брать" новости с новостных сайтов я хочу использовать Selenium Web Driver. А вопрос такой: как реализовать такую задачу что бы отдельный сервис каждые сколько-то минут (например 60) обращался к сайтам и смотрел новости (как реалезовать просмотр новостей и выбор новых я примерно представляю) и записывал актуальные новости в Модель? То есть акцент именно на том как научить серввер делать что-то по таймеру?

Пока что я сделал так: в методе index в конроллере при каждом обращении к странице я выполняю логику с помощью селениум, то есть при каждом обращении к сайту сервер обращается к новосным сайтам, обрабатывает инфу и выдаёт результат. А мне надо что бы каждый час вервер один раз проверял новостные сайты на наличие обновлений и записывал результаты проверки в модель и при каждом обращении к сайту актуальные новости брались бы из модели. Как?
  • Вопрос задан
  • 587 просмотров
Решения вопроса 1
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
примерно так:
public class JobHost : IRegisteredObject
    {
        private readonly object _lock = new object();
        private bool _shuttingDown;

        public JobHost()
        {
            HostingEnvironment.RegisterObject(this);
        }

        public void Stop(bool immediate)
        {
            lock (_lock)
            {
                _shuttingDown = true;
            }
            HostingEnvironment.UnregisterObject(this);
        }

        public void DoWork(Action work)
        {
            lock (_lock)
            {
                if (_shuttingDown)
                {
                    return;
                }
                work();
            }
        }
    }

public static class MyHelper
    {
        private static readonly Timer _timer = new Timer(OnTimerElapsed);
        private static readonly JobHost _jobHost = new JobHost();

        public static void Start()
        {
            _timer.Change(TimeSpan.Zero, TimeSpan.FromHours(1));
        }

        public static void OnTimerElapsed(object sender)
        {
            _jobHost.DoWork(() =>
            {
                // action ...
            });
        }
    }


ну и в global.asax прописать:
public class Application : HttpApplication
    {
        protected void Application_Start()
        {
            // ....
            MyHelper.Start();
        }
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@dmitryKovalskiy
программист средней руки
Я бы для таких задач вообще не использовал веб-сервер(у него своих задач хватает), а писал бы настольного бота(или службу), которая бы собирала и сохраняла данные в ваш источник.
Ответ написан
EreminD
@EreminD
Кое-что умею
Действительно, самый простой вариант - консолька, которая ходит на сайты, собирает все новости и пишет в нужное хранилище. Ну и запуск по расписанию
Служба - вариант чуть сложнее, но правильнее.

А еще, посмтрите сразу, нет ли у информациионных порталов, на которые вы натравите бот, каких-нибудь API?
Такой вариант будет еще лучше.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы