Итак, у меня есть техническая проблема, с которой мне нужна помощь.
В крупномасштабном проекте используется планировщик Quartz, чтобы запланировать выполнение задания каждую ночь в 9.
Задание, которое запланировано, однако должно считывать значения из файлов свойств, получать некоторые bean-компоненты с помощью автоматической разводки и т. Д.
Когда я использовал аннотации @Autowired и @Value, я обнаружил, что значения равны нулю.
Проблема в том, что Quartz создает объекты JobDetail, используя newJob()
вне контейнера пружины. Как видно из приведенного ниже кода.
JobKey jobKey = new JobKey("NightJob", "9-PM Job");
JobDetail jobDetail = newJob(NightJob.class).withIdentity(jobKey)
.usingJobData("Job-Id", "1")
.build();
Объект jobDetail
, который охватывает NightJob
, таким образом, не может получить доступ к файлам свойств или bean-компонентам с помощью Spring.
Вот мой NightJob
класс
public class NightJob implements Job{
//@Value to read from property file; here
//@Autowired to use some beans; here
@Override
public void execute(JobExecutionContext context) throws JobExecutionException{
}
}
Я отсканировал переполнение стека и включил в шорт-лист несколько решений. Я также прочитал комментарии и перечислил главные встречные комментарии.
Предложение 1: Избавьтесь от Quartz и используйте Spring Batch благодаря его хорошей интеграции с Spring Boot
Аргумент счетчика 1: Spring Batch излишен для простых задач. Использовать @ Запланировано
Предложение 2: Используйте аннотации @Scheduled и выражения cron, предоставляемые spring
Аргумент счетчика 2: Ваша заявка не будет готова в будущем, если вы удалите Quartz. Сложное планирование может потребоваться в будущем
Предложение 3: Используйте интерфейс пружины ApplicationContextAware.
Аргумент счетчика 3: Множество дополнительного кода. Поражает простую и легкую концепцию Spring boot
Существует ли более простой способ в Spring Boot для доступа к значениям файла свойств и объектам автосшивки в классе, который реализует задание Quartz (в этом случае класс NightJob
)