Я хочу использовать Quartz Scheduler в моем серверном приложении, использующем HK2 для внедрения зависимостей. Чтобы задания Quartz имели доступ к DI, они сами должны управляться DI. В результате я написал очень простую фабрику заданий с поддержкой HK2 и зарегистрировал ее в планировщике.
Он отлично работает с созданием экземпляров сервисов, соблюдая запрошенную область действия @Singleton
или @PerLookup
. Однако он не выполняет destroy()
неодноэлементных сервисов (= заданий) после их завершения.
Вопрос: как заставить HK2 правильно управлять заданиями, включая их повторное удаление?
Нужно ли мне идти по пути создания службы через serviceLocator.getServiceHandle()
, а затем вручную уничтожить службу, возможно, из JobListener (но как получить к нему ServiceHandle)?
Hk2JobFactory.java
@Service
public class Hk2JobFactory implements JobFactory {
private final Logger log = LoggerFactory.getLogger(getClass());
@Inject
ServiceLocator serviceLocator;
@Override
public Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws SchedulerException {
JobDetail jobDetail = bundle.getJobDetail();
Class<? extends Job> jobClass = jobDetail.getJobClass();
try {
log.debug("Producing instance of Job '" + jobDetail.getKey() + "', class=" + jobClass.getName());
Job job = serviceLocator.getService(jobClass);
if (job == null) {
log.debug("Unable to instantiate job via ServiceLocator, returning unmanaged instance.");
return jobClass.newInstance();
}
return job;
} catch (Exception e) {
SchedulerException se = new SchedulerException(
"Problem instantiating class '"
+ jobDetail.getJobClass().getName() + "'", e);
throw se;
}
}
}
HelloWorldJob.java
@Service
@PerLookup
public class HelloWorldJob implements Job {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@PostConstruct
public void setup() {
log.info("I'm born!");
}
@PreDestroy
public void shutdown() {
// it's never called... :-(
log.info("And I'm dead again");
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
log.info("Hello, world!");
}
}