Как отправить аргумент классу в Quartz.Net
Я использую Quartz.Net(версия 2) для запуска метода в классе каждый день в 8:00 и 20:00 (IntervalInHours = 12)
Все в порядке, так как я использовал ту же работу и триггеры как учебники на Quartz.Net, но мне нужно передать некоторые аргументы в классе и запустить базы методов по этим аргументам.
Может ли кто-нибудь помочь мне, как я могу использовать аргументы при использовании Quartz.Net?
Ответы
Ответ 1
Вы можете использовать JobDataMap
jobDetail.JobDataMap["jobSays"] = "Hello World!";
jobDetail.JobDataMap["myFloatValue"] = 3.141f;
jobDetail.JobDataMap["myStateData"] = new ArrayList();
public class DumbJob : IJob
{
public void Execute(JobExecutionContext context)
{
string instName = context.JobDetail.Name;
string instGroup = context.JobDetail.Group;
JobDataMap dataMap = context.JobDetail.JobDataMap;
string jobSays = dataMap.GetString("jobSays");
float myFloatValue = dataMap.GetFloat("myFloatValue");
ArrayList state = (ArrayList) dataMap["myStateData"];
state.Add(DateTime.UtcNow);
Console.WriteLine("Instance {0} of DumbJob says: {1}", instName, jobSays);
}
}
Ответ 2
Чтобы расширить ответ на @ArsenMkrt, если вы выполняете бесплатную конфигурацию задания 2.x в стиле, вы можете загрузить JobDataMap
вот так:
var job = JobBuilder.Create<MyJob>()
.WithIdentity("job name")
.UsingJobData("x", x)
.UsingJobData("y", y)
.Build();
Ответ 3
Аннотация
Позвольте мне продлить бит @arsen-mkrtchyan сообщение со значительным примечанием, которое может избежать болезненной поддержки Quartz code в производстве:
Проблема (для стойкости JobStore)
Помните о версии JobDataMap, если вы используете постоянную JobStore, например. AdoJobStore.
Сводка (TL; DR)
- Осторожно подумайте о создании/редактировании JobData, иначе это приведет к проблемам при запуске будущих заданий.
- Включить параметр конфигурации quartz.jobStore.useProperties как официальная документация рекомендует, чтобы свести к минимуму проблемы с версией. Позднее используйте JobDataMap.PutAsString().
Подробнее
Кроме того, в документации также указано, что это не так подчеркнуто, но может привести к большой проблеме обслуживания, если, например, вы удаляете какой-либо параметр в следующей версии вашего приложения:
Если вы используете постоянную JobStore (обсуждаемую в разделе JobStore этого урока), вам следует позаботиться о том, чтобы вы определили, что вы размещаете в JobDataMap, потому что объект в нем будет сериализован, и поэтому они становятся склонными к классу, проблемы с версией.
Также есть ссылка на настройку JobStore, упомянутую в соответствующий документ:
Параметр конфигурации quartz.jobStore.useProperties может быть установлен в значение "true" (по умолчанию false), чтобы проинструктировать AdoJobStore, что все значения в JobDataMaps будут строками и поэтому могут быть сохранены в виде пар имя-значение, вместо хранения более сложных объектов в их сериализованной форме в столбце BLOB. Это намного безопаснее в долгосрочной перспективе, так как вы избегаете проблем с версией класса, которые существуют с сериализацией ваших классов, отличных от String, в BLOB.