Лучший способ запуска запланированных задач [закрыто]



сегодня мы построили консольное приложение для выполнения запланированных задач для нашего ASP.NET сайт. Но я думаю, что этот подход немного подвержен ошибкам и трудно поддерживать. Как вы выполнить запланированные задачи (в ОС Windows/IIS и АСП.Чистая окружающая среда)



обновление:



примеры задач:




  • отправка электронной почты из электронной очереди в базе данных

  • удаление устаревших объектов из базы данных

  • получение статистики из Google AdWords и заполните таблицу в базе данных.

637   16  

16 ответов:

все мои задачи (которые должны быть запланированы) на сайте, хранятся на сайте и на специальной странице. Затем я написал простую службу Windows, которая так часто вызывает эту страницу. После запуска страницы она возвращает значение. Если я знаю, что есть еще работа, которую нужно сделать, я снова запускаю страницу, сразу же, иначе я запускаю ее через некоторое время. Это сработало очень хорошо для меня и сохраняет всю мою логику задачи с веб-кодом. Прежде чем писать простую службу Windows, я использовал Планировщик Windows для вызова страницы каждые x минут.

еще один удобный способ запустить это-использовать службу мониторинга, такую как Pingdom. Укажите их проверку http на страницу, на которой выполняется ваш сервисный код. Пусть страница возвращает результаты, которые затем могут быть использованы для запуска Pingdom для отправки предупреждающих сообщений, когда что-то не так.

эта техника Джеффа Этвуда для Stackoverflow Это самый простой метод, с которым я столкнулся. Он полагается на встроенный механизм обратного вызова "Cache item removed ASP.NET' s cache system

обновление: Stackoverflow перерос этот метод. Он работает только во время работы веб-сайта, но это очень простой метод, который полезен для многих людей.

кроме того, проверить Quartz.NET

создать пользовательская служба Windows.

У меня были некоторые критически важные задачи, настроенные как запланированные консольные приложения, и их было трудно поддерживать. Я создал службу Windows с "пульсом", который будет проверять расписание в моей БД каждые пару минут. Это сработало очень хорошо.

сказав это, я все еще использую запланированные консольные приложения для большинства моих некритических задач обслуживания. От добра добра не ищут.

Я обнаружил, что это легко для всех участников:

  • создайте метод webservice, такой как DoSuchAndSuchProcess
  • создайте консольное приложение, которое вызывает этот webmethod.
  • расписание консольное приложение в планировщике задач.

используя эту методологию, вся бизнес-логика содержится в вашем веб-приложении, но у вас есть надежность диспетчера задач windows или любого другого коммерческого диспетчера задач, чтобы запустить его и записать любые возвращает информацию, такую как отчет о выполнении. Использование веб-службы вместо публикации на странице имеет некоторое преимущество, потому что легче получить возвращаемые данные из веб-службы.

зачем изобретать колесо, использовать резьбу и класс таймера.

    protected void Application_Start()
    {
        Thread thread = new Thread(new ThreadStart(ThreadFunc));
        thread.IsBackground = true;
        thread.Name = "ThreadFunc";
        thread.Start();
    }

    protected void ThreadFunc()
    {
        System.Timers.Timer t = new System.Timers.Timer();
        t.Elapsed += new System.Timers.ElapsedEventHandler(TimerWorker);
        t.Interval = 10000;
        t.Enabled = true;
        t.AutoReset = true;
        t.Start();
    }

    protected void TimerWorker(object sender, System.Timers.ElapsedEventArgs e)
    {
        //work args
    }

использовать планировщик Windows для запуска веб-страницы.

чтобы предотвратить злонамеренный пользователь или поисковые пауки, чтобы запустить его, при настройке запланированной задачи, просто вызовите веб-страницу с помощью строки запроса, т. е. : mypage.aspx?from=scheduledtask

затем в загрузке страницы просто используйте условие : если (запрос.Querystring ["from"] = = " scheduledtask") { //executetask }

таким образом, ни один поисковый паук или вредоносный пользователь не сможет выполнить ваш запланированное задание.

эта библиотека работает как шарм http://www.codeproject.com/KB/cs/tsnewlib.aspx

Он позволяет управлять запланированными задачами Windows непосредственно через ваш .NET-код.

кроме того, если ваше приложение использует SQL SERVER, вы можете использовать агент SQL для планирования своих задач. Здесь мы обычно помещаем повторяющийся код, который управляется данными (напоминания по электронной почте, плановое обслуживание, чистки и т. д...). Отличная функция, встроенная в Агент SQL, - это параметры уведомления о сбое, которые могут предупреждать вас о сбое критической задачи.

Я не уверен, какие из запланированных задач вы имеете в виду. Если вы имеете в виду такие вещи, как "каждый час, обновите foo.xml " введите задачи, а затем используйте систему запланированных задач Windows. (Команда " at " или через контроллер.) Попросите его либо запустить консольное приложение, либо запросить специальную страницу, которая запускает процесс.

Edit: я должен добавить, что это нормальный способ заставить ваше приложение IIS работать в запланированных точках тоже. Поэтому предположим, что вы хотите проверять свою БД каждые 30 минут и отправлять напоминания пользователям о некоторые данные, вы можете использовать запланированные задачи, чтобы запросить эту страницу и, следовательно, получить IIS обработки вещей.

Если ваши потребности более сложны, вы можете рассмотреть возможность создания Службы Windows и запуска цикла для выполнения любой обработки, которая вам нужна. Это также имеет преимущество выделения кода для целей масштабирования или управления. С другой стороны, вам придется иметь дело со службами Windows.

Если у вас есть сервер, вы должны использовать планировщик задач windows. Использовать в /? из командной строки, чтобы увидеть варианты.

в противном случае, из веб-среды, вы, возможно, придется сделать что-то неприятное, как настроить другую машину, чтобы сделать запросы к определенной странице на временной интервал.

Я использовал Абидар успешно в an ASP.NET проект (вот некоторые справочная информация).

единственная проблема с этим методом заключается в том, что задачи не будут выполняться, если ASP.NET веб-приложение выгружается из памяти (т. е. из-за низкого использования). Одна вещь, которую я пытался создать задачу, чтобы попасть в веб-приложение каждые 5 минут, сохраняя его живым, но это, похоже, не работает надежно, поэтому теперь я использую планировщик Windows и основное консольное приложение вместо этого.

идеальным решением является создание службы Windows, хотя это может быть невозможно (т. е. если вы используете среду общего хостинга). Это также делает вещи немного проще с точки зрения обслуживания, чтобы держать вещи в веб-приложении.

вот еще один способ:

1) Создайте веб-скрипт "heartbeat", который отвечает за запуск задач, если они должны быть запущены или просрочены.

2) Создайте запланированный процесс где-нибудь (предпочтительно на том же веб-сервере), который попадает в webscript и заставляет его работать с регулярным интервалом. (например, задача расписания windows, которая тихо запускает сценарий heatbeat с помощью IE или whathaveyou)

тот факт, что код задачи содержится в a веб-скрипт исключительно ради сохранения кода внутри кодовая база веб-приложения (предполагается, что оба зависят друг от друга), что было бы проще для веб-разработчиков управлять.

альтернативный подход заключается в создании исполняемого серверного сценария / программы, которая выполняет всю работу по расписанию и запускает сам исполняемый файл как запланированную задачу. Это может обеспечить фундаментальную развязку между веб-приложением и запланированной задачей. Следовательно если вам нужно, чтобы ваши запланированные задачи выполнялись даже в том случае, если веб-приложение / база данных могут быть недоступны или недоступны, вы должны пойти с этим подходом.

вы можете легко создать службу Windows, которая запускает код на интервале с помощью ' ThreadPool.RegisterWaitForSingleObject' метод. Это действительно гладко и довольно легко настроить. Этот метод является более упрощенным подходом, чем использовать любой из таймеров в рамках.

посмотрите на ссылку ниже для получения дополнительной информации:

запуск периодического процесса в .NET с помощью Windows Service:
http://allen-conway-dotnet.blogspot.com/2009/12/running-periodic-process-in-net-using.html

мы также используем консольные приложения. Если вы используете инструменты ведения журнала, такие как Log4net, вы можете правильно контролировать их выполнение. Кроме того, я не уверен, как их сложнее поддерживать, чем веб-страницу, учитывая, что вы можете делиться некоторыми из тех же библиотек кода между ними, если он правильно спроектирован.

Если вы против того, чтобы эти задачи выполнялись на временной основе, у вас может быть веб-страница в административном разделе вашего веб-сайта, которая действует как очередь. Пользователь помещает запрос чтобы запустить задачу, она, в свою очередь, вставляет пустую запись datestamp в таблицу MyProcessQueue, и ваша запланированная задача проверяет каждые X минут новую запись в MyProcessQueue. Таким образом, он работает только тогда, когда клиент хочет, чтобы он работал.

надеемся, что эти предложения помогут.

одним из вариантов было бы настроить службу windows и получить ее для вызова запланированной задачи.

в winforms я использовал таймеры положить не думаю, что это будет хорошо работать в ASP.NET

новая библиотека классов планировщика задач для .NET

Примечание: с момента создания этой библиотеки Microsoft представила новый планировщик задач (Task Scheduler 2.0) для Windows Vista. Эта библиотека является оболочкой для интерфейса планировщика задач 1.0, который по-прежнему доступен в Vista и совместим с Windows XP, Windows Server 2003 и Windows 2000.

http://www.codeproject.com/KB/cs/tsnewlib.aspx

Comments

    Ничего не найдено.