Планировщик задач Windows для выполнения задач за считанные секунды - PullRequest
17 голосов
/ 14 октября 2011

Я ищу планировщик заданий с открытым исходным кодом / бесплатно для Windows 7 (машина разработки), который позволил бы мне планировать выполнение задач (HTTP-запросов к веб-службе) каждые x секунд.

Я пробовал пару клонов Cron и собственный планировщик задач Windows, но ни один из них не позволяет запускать задачи с интервалами менее 60 секунд. Я что-то пропустил? Я не хочу идти и писать какие-либо собственные сценарии, если это возможно.

Ответы [ 4 ]

31 голосов
/ 06 декабря 2012

Можно создать несколько триггеров для одной запланированной задачи. Если вы создаете 59 идентичных триггеров со смещением 1 секунда друг к другу и планируете запускать каждую минуту каждую минуту, вы в конечном итоге запускаете запланированное задание каждую секунду.

Вы можете создать эти 59 триггеров вручную, используя графический интерфейс. Однако гораздо более быстрый способ создания такого количества триггеров - создать задачу с одним или двумя триггерами, экспортировать ее в текстовый файл, продублировать соответствующие строки, соответственно изменить начальные смещения, а затем повторно импортировать файл.

6 голосов
/ 08 ноября 2013

Я действительно смог достичь этого.

Обновление: кажется, я слишком усложнил.

В триггере, где он говорит "Повторять задачу каждые:" Вы можете ТИП в раскрывающемся списке "1 минута" (Это не позволит вам ввести время в секундах)

Я сделал это на компьютере с Windows 7.

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

Кажется, что вы не можете заставить его работать с интервалом меньшечем одна минута.


Я установил задачу с триггером, установленным на Ежедневно, чтобы повторяться каждые 1 день.Я отмечаю флажок «Повторять задание каждые:».Установка этого значения на 5 минут в течение 1 дня

Это заставляет задачу идти вечно, каждые 5 минут.

Затем я экспортировал задачу.Он экспортируется в XML-файл.

Под Task > Triggers > CalendarTrigger > Repeition есть следующий тег: <Interval>PT5M</Interval> Я изменил его с PT5M на PT1M.Я повторно импортировал задачу.

Задача теперь запускается каждую 1 минуту.

Я не полностью проверил это, и я не пробовал менее одной минуты, но это возможноположив PT30S или что-то на 30 секунд.Я попробую это и сообщу. Обновление: вы не можете сделать это, вы получаете ошибку при импорте задачи.Невозможно установить это время меньше 1 минуты.

Для меня весь триггер выглядит так:

  <Triggers>
    <CalendarTrigger>
      <Repetition>
        <Interval>PT1M</Interval>
        <Duration>P1D</Duration>
        <StopAtDurationEnd>false</StopAtDurationEnd>
      </Repetition>
      <StartBoundary>2013-11-07T17:04:51.6062297</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
3 голосов
/ 20 октября 2011

Я погуглил это до смерти, так что, насколько я вижу, ответа нет. Существует множество коммерческих решений, но нет открытых и бесплатных программ.

В итоге я написал очень простой периодический планировщик HTTP GET в Java, используя кварцевый планировщик . Это может быть полезно другим, поэтому размещение ссылки на источник на guthub https://github.com/bjordan/simple_java_periodic_HTTP_scheduler

0 голосов
/ 19 января 2016

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

Job scheduler

  1. Создание класса, расширяющего класс System.ServiceProcess.ServiceBase
  2. Реализация хотя бы методов OnStart и OnStop
  3. Запуск и использование планировщика Quartz.NET в OnStart для периодического запуска задач

Вот мое шаблонное решение C # для службы Windows и демона Linux в .NET / Mono https://github.com/mchudinov/ServiceDemon И краткий пост в блоге об этом

</p> <pre><code> class Program { public static void Main(string[] args) { ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new ServiceDemon.Service() }; ServiceBase.Run(ServicesToRun); } } public class Service : ServiceBase { static IScheduler Scheduler { get; set; } protected override void OnStart(string[] args) { StartScheduler(); StartMyJob(); } protected override void OnStop() { Scheduler.Shutdown(); } void StartScheduler() { ISchedulerFactory schedFact = new StdSchedulerFactory(); Scheduler = schedFact.GetScheduler(); Scheduler.Start(); } void StartMyJob() { var seconds = Int16.Parse(ConfigurationManager.AppSettings["MyJobSeconds"]); IJobDetail job = JobBuilder.Create<Jobs.MyJob>() .WithIdentity("MyJob", "group1") .UsingJobData("Param1", "Hello MyJob!") .Build(); ITrigger trigger = TriggerBuilder.Create() .WithIdentity("MyJobTrigger", "group1") .StartNow() .WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).RepeatForever()) .Build(); Scheduler.ScheduleJob(job, trigger); } } public class MyJob : IJob { public void Execute(IJobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; log.Info(dataMap["Param1"]); } }

...