Планировщик задач Windows для выполнения задач в считанные секунды
Я ищу планировщик задач с открытым исходным кодом для Windows 7 (машина разработки), который позволит мне планировать задачи (HTTP-запросы к веб-службе) для запуска каждые x секунд.
Я попробовал пару клонов Cron и собственный планировщик задач windows, но ни один из них не позволяет задачам выполняться с интервалом менее 60 секунд. Я что-то упустил? Я не хочу идти и писать какие-либо пользовательские сценарии, если это возможно.
4 ответа:
Для одной запланированной задачи можно создать несколько триггеров. Если вы создадите 59 идентичных триггеров со смещением 1 секунда по отношению друг к другу и запланируете выполнение самой задачи каждую минуту, то в конечном итоге запланированная задача будет выполняться каждую секунду.
Вы можете создать эти 59 триггеров вручную, используя графический интерфейс. Однако гораздо более быстрый способ создать так много триггеров-это создать задачу с одним или двумя триггерами, экспортировать ее в текстовый файл, дублировать соответствующие строки, изменить начало смещает соответственно, а затем повторно импортирует файл.
Я действительно смог добиться этого.
Обновление: кажется, я слишком усложнил его.
В триггере, где он говорит "повторять задание каждые:" вы можете на самом деле ввести в раскрывающемся списке "1 минута" (это не позволит вам ввести время в секундах)
Я сделал это на машине с Windows 7.
Кроме того, я явно недостаточно хорошо прочитал вопрос, поскольку Аскер, похоже, уже смог сократить время до 1 минуты. Однако, Я оставлю этот ответ здесь, так как он объяснит будущим читателям, как именно сократить время до одной минуты. Кажется, что вы не можете заставить его работать с интервалом менее одной минуты.
Я поставил задачу с триггером, установленным ежедневно, чтобы повторяться каждые 1 день. Я ставлю галочку в поле " повторять задание каждые:". Установка его на 5 минут в течение 1 дня
Это заставляет задачу идти вечно, каждые 5 минут.Затем я экспортировал задачу. Его экспорт в .XML-файл.
Под
Задача теперь выполняется каждые 1 минуту. Я не полностью проверил это, и я не пробовал меньше одной минуты, но это может быть возможно, поместивTask > Triggers > CalendarTrigger > Repeition
есть следующий тег:<Interval>PT5M</Interval>
я изменил его сPT5M
наPT1M
. Я повторно импортировал задачу.PT30S
или что-то в течение 30 секунд. Я попробую и доложу о результатах. Update: вы не можете этого сделать, вы получаете ошибку при импорте задачи. Это не возможно, чтобы установить это время до менее чем 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>
Я загуглил это до смерти, так что, насколько я вижу, ответа нет. Существует множество коммерческих решений,но нет программ с открытым исходным кодом.
В итоге я написал очень простой периодический планировщик HTTP GET на java, используяQuartz scheduler . Это может быть полезно для других, поэтому размещение ссылки на источник на guthub https://github.com/bjordan/simple_java_periodic_HTTP_scheduler
Краткое объяснение: Основная программа запускает процесс обслуживания, который будет оставаться активным в памяти и периодически будет активировать задание – сделать что-то.
- создайте класс, расширяющий систему.Событий.Класс базы обслуживания
- реализовать хотя бы методы OnStart и OnStop
- запуск и использование Quartz.NET планировщик в OnStart для периодического выполнения задач
Вот мое шаблонное решение C# для службы Windows и демона Linux в .NET / Mono https://github.com/mchudinov/ServiceDemon И короткий блог об этом
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"]); } }