From 8fca468e1fd678c9c7aa03d6c95497b7daa71b66 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Tue, 19 Nov 2019 10:13:22 -0500 Subject: [PATCH 01/34] remove boolean from scheduling API --- .../fhir/model/api/ISmartLifecyclePhase.java | 10 + .../fhir/jpa/bulk/BulkDataExportSvcImpl.java | 4 +- .../ca/uhn/fhir/jpa/sched/NullScheduler.java | 297 +++++++++++++ .../fhir/jpa/sched/SchedulerServiceImpl.java | 406 ++++-------------- .../search/StaleSearchDeletingSvcImpl.java | 2 +- .../search/cache/BaseSearchCacheSvcImpl.java | 2 +- .../reindex/ResourceReindexingSvcImpl.java | 2 +- .../jpa/search/warm/CacheWarmingSvcImpl.java | 2 +- .../SubscriptionTriggeringSvcImpl.java | 2 +- .../fhir/jpa/term/BaseTermReadSvcImpl.java | 26 +- .../jpa/term/TermDeferredStorageSvcImpl.java | 2 +- .../fhir/jpa/term/TermReindexingSvcImpl.java | 2 +- .../uhn/fhir/jpa/util/ResourceCountCache.java | 2 +- .../jpa/sched/SchedulerServiceImplTest.java | 12 +- .../SubscriptionTriggeringDstu3Test.java | 7 +- .../jpa/model/sched/ISchedulerService.java | 13 +- .../registry/SearchParamRegistryImpl.java | 17 +- .../module/cache/SubscriptionLoader.java | 2 +- .../interceptor/AnalyticsInterceptor.java | 2 +- 19 files changed, 418 insertions(+), 394 deletions(-) create mode 100644 hapi-fhir-base/src/main/java/ca/uhn/fhir/model/api/ISmartLifecyclePhase.java create mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/api/ISmartLifecyclePhase.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/api/ISmartLifecyclePhase.java new file mode 100644 index 00000000000..00fd2b60510 --- /dev/null +++ b/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/api/ISmartLifecyclePhase.java @@ -0,0 +1,10 @@ +package ca.uhn.fhir.model.api; + +public interface ISmartLifecyclePhase { + // POST_CONSTRUCT is here as a marker for where post-construct fits into the smart lifecycle. Beans with negative phases + // will be started before @PostConstruct are called + int POST_CONSTRUCT = 0; + + // We want to start scheduled tasks fairly late in the startup process + int SCHEDULER_1000 = 1000; +} diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java index 987936d8677..aae0c2eb27b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java @@ -25,13 +25,13 @@ import ca.uhn.fhir.jpa.dao.DaoRegistry; import ca.uhn.fhir.jpa.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.dao.IResultIterator; import ca.uhn.fhir.jpa.dao.ISearchBuilder; -import ca.uhn.fhir.jpa.model.cross.ResourcePersistentId; import ca.uhn.fhir.jpa.dao.data.IBulkExportCollectionDao; import ca.uhn.fhir.jpa.dao.data.IBulkExportCollectionFileDao; import ca.uhn.fhir.jpa.dao.data.IBulkExportJobDao; import ca.uhn.fhir.jpa.entity.BulkExportCollectionEntity; import ca.uhn.fhir.jpa.entity.BulkExportCollectionFileEntity; import ca.uhn.fhir.jpa.entity.BulkExportJobEntity; +import ca.uhn.fhir.jpa.model.cross.ResourcePersistentId; import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; import ca.uhn.fhir.jpa.model.sched.ISchedulerService; import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; @@ -319,7 +319,7 @@ public class BulkDataExportSvcImpl implements IBulkDataExportSvc { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(BulkDataExportSvcImpl.class.getName()); jobDetail.setJobClass(BulkDataExportSvcImpl.SubmitJob.class); - mySchedulerService.scheduleFixedDelay(REFRESH_INTERVAL, true, jobDetail); + mySchedulerService.scheduleFixedDelayClustered(REFRESH_INTERVAL, jobDetail); } @Transactional diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java new file mode 100644 index 00000000000..ef207449b4f --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java @@ -0,0 +1,297 @@ +package ca.uhn.fhir.jpa.sched; + +import org.quartz.*; +import org.quartz.impl.matchers.GroupMatcher; +import org.quartz.spi.JobFactory; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; + +class NullScheduler implements Scheduler { + @Override + public String getSchedulerName() { + return null; + } + + @Override + public String getSchedulerInstanceId() { + return null; + } + + @Override + public SchedulerContext getContext() { + return null; + } + + @Override + public void start() { + + } + + @Override + public void startDelayed(int seconds) { + + } + + @Override + public boolean isStarted() { + return false; + } + + @Override + public void standby() { + + } + + @Override + public boolean isInStandbyMode() { + return false; + } + + @Override + public void shutdown() { + + } + + @Override + public void shutdown(boolean waitForJobsToComplete) { + + } + + @Override + public boolean isShutdown() { + return false; + } + + @Override + public SchedulerMetaData getMetaData() { + return null; + } + + @Override + public List getCurrentlyExecutingJobs() { + return null; + } + + @Override + public void setJobFactory(JobFactory factory) { + + } + + @Override + public ListenerManager getListenerManager() { + return null; + } + + @Override + public Date scheduleJob(JobDetail jobDetail, Trigger trigger) { + return null; + } + + @Override + public Date scheduleJob(Trigger trigger) { + return null; + } + + @Override + public void scheduleJobs(Map> triggersAndJobs, boolean replace) { + + } + + @Override + public void scheduleJob(JobDetail jobDetail, Set triggersForJob, boolean replace) { + + } + + @Override + public boolean unscheduleJob(TriggerKey triggerKey) { + return false; + } + + @Override + public boolean unscheduleJobs(List triggerKeys) { + return false; + } + + @Override + public Date rescheduleJob(TriggerKey triggerKey, Trigger newTrigger) { + return null; + } + + @Override + public void addJob(JobDetail jobDetail, boolean replace) { + + } + + @Override + public void addJob(JobDetail jobDetail, boolean replace, boolean storeNonDurableWhileAwaitingScheduling) { + + } + + @Override + public boolean deleteJob(JobKey jobKey) { + return false; + } + + @Override + public boolean deleteJobs(List jobKeys) { + return false; + } + + @Override + public void triggerJob(JobKey jobKey) { + + } + + @Override + public void triggerJob(JobKey jobKey, JobDataMap data) { + + } + + @Override + public void pauseJob(JobKey jobKey) { + + } + + @Override + public void pauseJobs(GroupMatcher matcher) { + + } + + @Override + public void pauseTrigger(TriggerKey triggerKey) { + + } + + @Override + public void pauseTriggers(GroupMatcher matcher) { + + } + + @Override + public void resumeJob(JobKey jobKey) { + + } + + @Override + public void resumeJobs(GroupMatcher matcher) { + + } + + @Override + public void resumeTrigger(TriggerKey triggerKey) { + + } + + @Override + public void resumeTriggers(GroupMatcher matcher) { + + } + + @Override + public void pauseAll() { + + } + + @Override + public void resumeAll() { + + } + + @Override + public List getJobGroupNames() { + return null; + } + + @Override + public Set getJobKeys(GroupMatcher matcher) { + return null; + } + + @Override + public List getTriggersOfJob(JobKey jobKey) { + return null; + } + + @Override + public List getTriggerGroupNames() { + return null; + } + + @Override + public Set getTriggerKeys(GroupMatcher matcher) { + return null; + } + + @Override + public Set getPausedTriggerGroups() { + return null; + } + + @Override + public JobDetail getJobDetail(JobKey jobKey) { + return null; + } + + @Override + public Trigger getTrigger(TriggerKey triggerKey) { + return null; + } + + @Override + public Trigger.TriggerState getTriggerState(TriggerKey triggerKey) { + return null; + } + + @Override + public void resetTriggerFromErrorState(TriggerKey triggerKey) { + + } + + @Override + public void addCalendar(String calName, Calendar calendar, boolean replace, boolean updateTriggers) { + + } + + @Override + public boolean deleteCalendar(String calName) { + return false; + } + + @Override + public Calendar getCalendar(String calName) { + return null; + } + + @Override + public List getCalendarNames() { + return null; + } + + @Override + public boolean interrupt(JobKey jobKey) throws UnableToInterruptJobException { + return false; + } + + @Override + public boolean interrupt(String fireInstanceId) throws UnableToInterruptJobException { + return false; + } + + @Override + public boolean checkExists(JobKey jobKey) { + return false; + } + + @Override + public boolean checkExists(TriggerKey triggerKey) { + return false; + } + + @Override + public void clear() { + + } +} diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java index b996f1f600d..d97a47e0a57 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java @@ -20,28 +20,29 @@ package ca.uhn.fhir.jpa.sched; * #L% */ +import ca.uhn.fhir.context.ConfigurationException; import ca.uhn.fhir.jpa.model.sched.ISchedulerService; import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; +import ca.uhn.fhir.model.api.ISmartLifecyclePhase; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import com.google.common.collect.Sets; import org.apache.commons.lang3.Validate; -import org.quartz.Calendar; import org.quartz.*; import org.quartz.impl.JobDetailImpl; import org.quartz.impl.StdSchedulerFactory; import org.quartz.impl.matchers.GroupMatcher; -import org.quartz.spi.JobFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.context.event.EventListener; +import org.springframework.context.ApplicationContext; +import org.springframework.context.SmartLifecycle; import org.springframework.core.env.Environment; import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import java.util.*; +import java.util.Properties; +import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import static org.quartz.impl.StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME; @@ -63,22 +64,24 @@ import static org.quartz.impl.StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME; * * */ -public class SchedulerServiceImpl implements ISchedulerService { +public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { public static final String SCHEDULING_DISABLED = "scheduling_disabled"; public static final String SCHEDULING_DISABLED_EQUALS_TRUE = SCHEDULING_DISABLED + "=true"; private static final Logger ourLog = LoggerFactory.getLogger(SchedulerServiceImpl.class); - private static int ourNextSchedulerId = 0; + private static AtomicInteger ourNextSchedulerId = new AtomicInteger(); private Scheduler myLocalScheduler; private Scheduler myClusteredScheduler; private String myThreadNamePrefix; private boolean myLocalSchedulingEnabled; private boolean myClusteredSchedulingEnabled; - @Autowired - private AutowiringSpringBeanJobFactory mySpringBeanJobFactory; private AtomicBoolean myStopping = new AtomicBoolean(false); @Autowired + private AutowiringSpringBeanJobFactory mySpringBeanJobFactory; + @Autowired private Environment myEnvironment; + @Autowired + private ApplicationContext myApplicationContext; /** * Constructor @@ -114,38 +117,18 @@ public class SchedulerServiceImpl implements ISchedulerService { } @PostConstruct - public void start() throws SchedulerException { + public void create() throws SchedulerException { myLocalScheduler = createLocalScheduler(); myClusteredScheduler = createClusteredScheduler(); myStopping.set(false); } - /** - * We defer startup of executing started tasks until we're sure we're ready for it - * and the startup is completely done - */ - @EventListener - public void contextStarted(ContextRefreshedEvent theEvent) throws SchedulerException { - try { - ourLog.info("Starting task schedulers for context {}", theEvent != null ? theEvent.getApplicationContext().getId() : "null"); - if (myLocalScheduler != null) { - myLocalScheduler.start(); - } - if (myClusteredScheduler != null) { - myClusteredScheduler.start(); - } - } catch (Exception e) { - ourLog.error("Failed to start context", e); - throw new SchedulerException(e); - } - } - private Scheduler createLocalScheduler() throws SchedulerException { if (!isLocalSchedulingEnabled() || isSchedulingDisabledForUnitTests()) { return new NullScheduler(); } Properties localProperties = new Properties(); - localProperties.setProperty(PROP_SCHED_INSTANCE_NAME, "local-" + ourNextSchedulerId++); + localProperties.setProperty(PROP_SCHED_INSTANCE_NAME, "local-" + ourNextSchedulerId.getAndIncrement()); quartzPropertiesCommon(localProperties); quartzPropertiesLocal(localProperties); StdSchedulerFactory factory = new StdSchedulerFactory(); @@ -161,7 +144,7 @@ public class SchedulerServiceImpl implements ISchedulerService { return new NullScheduler(); } Properties clusteredProperties = new Properties(); - clusteredProperties.setProperty(PROP_SCHED_INSTANCE_NAME, "clustered-" + ourNextSchedulerId++); + clusteredProperties.setProperty(PROP_SCHED_INSTANCE_NAME, "clustered-" + ourNextSchedulerId.getAndIncrement()); quartzPropertiesCommon(clusteredProperties); quartzPropertiesClustered(clusteredProperties); StdSchedulerFactory factory = new StdSchedulerFactory(); @@ -176,13 +159,54 @@ public class SchedulerServiceImpl implements ISchedulerService { theScheduler.setJobFactory(mySpringBeanJobFactory); } - @PreDestroy - public void stop() throws SchedulerException { + /** + * We defer startup of executing started tasks until we're sure we're ready for it + * and the startup is completely done + */ + + @Override + public int getPhase() { + return ISmartLifecyclePhase.SCHEDULER_1000; + } + + @Override + public void start() { + try { + ourLog.info("Starting task schedulers for context {}", myApplicationContext.getId()); + if (myLocalScheduler != null) { + myLocalScheduler.start(); + } + if (myClusteredScheduler != null) { + myClusteredScheduler.start(); + } + } catch (Exception e) { + ourLog.error("Failed to start scheduler", e); + throw new ConfigurationException("Failed to start scheduler", e); + } + } + + @Override + public void stop() { ourLog.info("Shutting down task scheduler..."); myStopping.set(true); - myLocalScheduler.shutdown(true); - myClusteredScheduler.shutdown(true); + try { + myLocalScheduler.shutdown(true); + myClusteredScheduler.shutdown(true); + } catch (SchedulerException e) { + ourLog.error("Failed to shut down scheduler"); + throw new ConfigurationException("Failed to shut down scheduler", e); + } + } + + @Override + public boolean isRunning() { + try { + return !myStopping.get() && myLocalScheduler.isStarted() && myClusteredScheduler.isStarted(); + } catch (SchedulerException e) { + ourLog.error("Failed to determine scheduler status", e); + return false; + } } @Override @@ -192,7 +216,7 @@ public class SchedulerServiceImpl implements ISchedulerService { } @Override - public void logStatus() { + public void logStatusForUnitTest() { try { Set keys = myLocalScheduler.getJobKeys(GroupMatcher.anyGroup()); String keysString = keys.stream().map(t -> t.getName()).collect(Collectors.joining(", ")); @@ -207,7 +231,16 @@ public class SchedulerServiceImpl implements ISchedulerService { } @Override - public void scheduleFixedDelay(long theIntervalMillis, boolean theClusteredTask, ScheduledJobDefinition theJobDefinition) { + public void scheduleFixedDelayLocal(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { + scheduleFixedDelay(theIntervalMillis, myLocalScheduler, theJobDefinition); + } + + @Override + public void scheduleFixedDelayClustered(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { + scheduleFixedDelay(theIntervalMillis, myClusteredScheduler, theJobDefinition); + } + + private void scheduleFixedDelay(long theIntervalMillis, Scheduler theScheduler, ScheduledJobDefinition theJobDefinition) { Validate.isTrue(theIntervalMillis >= 100); Validate.notNull(theJobDefinition); @@ -235,13 +268,7 @@ public class SchedulerServiceImpl implements ISchedulerService { Set triggers = Sets.newHashSet(trigger); try { - Scheduler scheduler; - if (theClusteredTask) { - scheduler = myClusteredScheduler; - } else { - scheduler = myLocalScheduler; - } - scheduler.scheduleJob(jobDetail, triggers, true); + theScheduler.scheduleJob(jobDetail, triggers, true); } catch (SchedulerException e) { ourLog.error("Failed to schedule job", e); throw new InternalErrorException(e); @@ -288,292 +315,5 @@ public class SchedulerServiceImpl implements ISchedulerService { } } - private static class NullScheduler implements Scheduler { - @Override - public String getSchedulerName() { - return null; - } - - @Override - public String getSchedulerInstanceId() { - return null; - } - - @Override - public SchedulerContext getContext() { - return null; - } - - @Override - public void start() { - - } - - @Override - public void startDelayed(int seconds) { - - } - - @Override - public boolean isStarted() { - return false; - } - - @Override - public void standby() { - - } - - @Override - public boolean isInStandbyMode() { - return false; - } - - @Override - public void shutdown() { - - } - - @Override - public void shutdown(boolean waitForJobsToComplete) { - - } - - @Override - public boolean isShutdown() { - return false; - } - - @Override - public SchedulerMetaData getMetaData() { - return null; - } - - @Override - public List getCurrentlyExecutingJobs() { - return null; - } - - @Override - public void setJobFactory(JobFactory factory) { - - } - - @Override - public ListenerManager getListenerManager() { - return null; - } - - @Override - public Date scheduleJob(JobDetail jobDetail, Trigger trigger) { - return null; - } - - @Override - public Date scheduleJob(Trigger trigger) { - return null; - } - - @Override - public void scheduleJobs(Map> triggersAndJobs, boolean replace) { - - } - - @Override - public void scheduleJob(JobDetail jobDetail, Set triggersForJob, boolean replace) { - - } - - @Override - public boolean unscheduleJob(TriggerKey triggerKey) { - return false; - } - - @Override - public boolean unscheduleJobs(List triggerKeys) { - return false; - } - - @Override - public Date rescheduleJob(TriggerKey triggerKey, Trigger newTrigger) { - return null; - } - - @Override - public void addJob(JobDetail jobDetail, boolean replace) { - - } - - @Override - public void addJob(JobDetail jobDetail, boolean replace, boolean storeNonDurableWhileAwaitingScheduling) { - - } - - @Override - public boolean deleteJob(JobKey jobKey) { - return false; - } - - @Override - public boolean deleteJobs(List jobKeys) { - return false; - } - - @Override - public void triggerJob(JobKey jobKey) { - - } - - @Override - public void triggerJob(JobKey jobKey, JobDataMap data) { - - } - - @Override - public void pauseJob(JobKey jobKey) { - - } - - @Override - public void pauseJobs(GroupMatcher matcher) { - - } - - @Override - public void pauseTrigger(TriggerKey triggerKey) { - - } - - @Override - public void pauseTriggers(GroupMatcher matcher) { - - } - - @Override - public void resumeJob(JobKey jobKey) { - - } - - @Override - public void resumeJobs(GroupMatcher matcher) { - - } - - @Override - public void resumeTrigger(TriggerKey triggerKey) { - - } - - @Override - public void resumeTriggers(GroupMatcher matcher) { - - } - - @Override - public void pauseAll() { - - } - - @Override - public void resumeAll() { - - } - - @Override - public List getJobGroupNames() { - return null; - } - - @Override - public Set getJobKeys(GroupMatcher matcher) { - return null; - } - - @Override - public List getTriggersOfJob(JobKey jobKey) { - return null; - } - - @Override - public List getTriggerGroupNames() { - return null; - } - - @Override - public Set getTriggerKeys(GroupMatcher matcher) { - return null; - } - - @Override - public Set getPausedTriggerGroups() { - return null; - } - - @Override - public JobDetail getJobDetail(JobKey jobKey) { - return null; - } - - @Override - public Trigger getTrigger(TriggerKey triggerKey) { - return null; - } - - @Override - public Trigger.TriggerState getTriggerState(TriggerKey triggerKey) { - return null; - } - - @Override - public void resetTriggerFromErrorState(TriggerKey triggerKey) { - - } - - @Override - public void addCalendar(String calName, Calendar calendar, boolean replace, boolean updateTriggers) { - - } - - @Override - public boolean deleteCalendar(String calName) { - return false; - } - - @Override - public Calendar getCalendar(String calName) { - return null; - } - - @Override - public List getCalendarNames() { - return null; - } - - @Override - public boolean interrupt(JobKey jobKey) throws UnableToInterruptJobException { - return false; - } - - @Override - public boolean interrupt(String fireInstanceId) throws UnableToInterruptJobException { - return false; - } - - @Override - public boolean checkExists(JobKey jobKey) { - return false; - } - - @Override - public boolean checkExists(TriggerKey triggerKey) { - return false; - } - - @Override - public void clear() { - - } - } - } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java index af25e9a0eea..e69bbc68b08 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java @@ -62,7 +62,7 @@ public class StaleSearchDeletingSvcImpl implements IStaleSearchDeletingSvc { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(StaleSearchDeletingSvcImpl.class.getName()); jobDetail.setJobClass(StaleSearchDeletingSvcImpl.SubmitJob.class); - mySchedulerService.scheduleFixedDelay(DEFAULT_CUTOFF_SLACK, true, jobDetail); + mySchedulerService.scheduleFixedDelayClustered(DEFAULT_CUTOFF_SLACK, jobDetail); } @Transactional(propagation = Propagation.NEVER) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java index dfa11bfaa0a..d5d13d8b69b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java @@ -55,7 +55,7 @@ public abstract class BaseSearchCacheSvcImpl implements ISearchCacheSvc { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(BaseSearchCacheSvcImpl.class.getName()); jobDetail.setJobClass(BaseSearchCacheSvcImpl.SubmitJob.class); - mySchedulerService.scheduleFixedDelay(10 * DateUtils.MILLIS_PER_SECOND, false, jobDetail); + mySchedulerService.scheduleFixedDelayLocal(10 * DateUtils.MILLIS_PER_SECOND, jobDetail); } @Override diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java index ef98b9dbdca..cfe624d3ad5 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java @@ -192,7 +192,7 @@ public class ResourceReindexingSvcImpl implements IResourceReindexingSvc { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(ResourceReindexingSvcImpl.class.getName()); jobDetail.setJobClass(ResourceReindexingSvcImpl.SubmitJob.class); - mySchedulerService.scheduleFixedDelay(10 * DateUtils.MILLIS_PER_SECOND, true, jobDetail); + mySchedulerService.scheduleFixedDelayClustered(10 * DateUtils.MILLIS_PER_SECOND, jobDetail); } @VisibleForTesting diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java index 9cbf950be53..7df6430098e 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java @@ -88,7 +88,7 @@ public class CacheWarmingSvcImpl implements ICacheWarmingSvc { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(CacheWarmingSvcImpl.class.getName()); jobDetail.setJobClass(CacheWarmingSvcImpl.SubmitJob.class); - mySchedulerService.scheduleFixedDelay(SCHEDULED_JOB_INTERVAL, true, jobDetail); + mySchedulerService.scheduleFixedDelayClustered(SCHEDULED_JOB_INTERVAL, jobDetail); } private void refreshNow(WarmCacheEntry theCacheEntry) { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java index 756ad775c24..04ce27d09a5 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java @@ -164,7 +164,7 @@ public class SubscriptionTriggeringSvcImpl implements ISubscriptionTriggeringSvc ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(SubscriptionTriggeringSvcImpl.class.getName()); jobDetail.setJobClass(SubscriptionTriggeringSvcImpl.SubmitJob.class); - mySchedulerService.scheduleFixedDelay(SCHEDULE_DELAY, false, jobDetail); + mySchedulerService.scheduleFixedDelayLocal(SCHEDULE_DELAY, jobDetail); } @Override diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index c1abe4308d1..b6ef5ffb835 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -23,13 +23,8 @@ package ca.uhn.fhir.jpa.term; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.context.support.IContextValidationSupport; -import ca.uhn.fhir.jpa.dao.DaoConfig; -import ca.uhn.fhir.jpa.dao.DaoRegistry; -import ca.uhn.fhir.jpa.dao.IDao; -import ca.uhn.fhir.jpa.dao.IFhirResourceDaoCodeSystem; -import ca.uhn.fhir.jpa.dao.IFhirResourceDaoValueSet; +import ca.uhn.fhir.jpa.dao.*; import ca.uhn.fhir.jpa.dao.IFhirResourceDaoValueSet.ValidateCodeResult; -import ca.uhn.fhir.jpa.dao.IFulltextSearchSvc; import ca.uhn.fhir.jpa.dao.data.*; import ca.uhn.fhir.jpa.entity.*; import ca.uhn.fhir.jpa.entity.TermConceptParentChildLink.RelationshipTypeEnum; @@ -60,11 +55,7 @@ import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.time.DateUtils; import org.apache.lucene.index.Term; import org.apache.lucene.queries.TermsQuery; -import org.apache.lucene.search.BooleanClause; -import org.apache.lucene.search.BooleanQuery; -import org.apache.lucene.search.MultiPhraseQuery; -import org.apache.lucene.search.Query; -import org.apache.lucene.search.RegexpQuery; +import org.apache.lucene.search.*; import org.hibernate.ScrollMode; import org.hibernate.ScrollableResults; import org.hibernate.search.jpa.FullTextEntityManager; @@ -101,21 +92,14 @@ import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContextType; import javax.persistence.TypedQuery; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Join; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; +import javax.persistence.criteria.*; import javax.validation.constraints.NotNull; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -import static org.apache.commons.lang3.StringUtils.defaultString; -import static org.apache.commons.lang3.StringUtils.isBlank; -import static org.apache.commons.lang3.StringUtils.isNoneBlank; -import static org.apache.commons.lang3.StringUtils.isNotBlank; +import static org.apache.commons.lang3.StringUtils.*; public abstract class BaseTermReadSvcImpl implements ITermReadSvc, ApplicationContextAware { public static final int DEFAULT_FETCH_SIZE = 250; @@ -1325,7 +1309,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc, ApplicationCo ScheduledJobDefinition vsJobDefinition = new ScheduledJobDefinition(); vsJobDefinition.setId(BaseTermReadSvcImpl.class.getName() + "_preExpandValueSets"); vsJobDefinition.setJobClass(PreExpandValueSetsJob.class); - mySchedulerService.scheduleFixedDelay(10 * DateUtils.MILLIS_PER_MINUTE, true, vsJobDefinition); + mySchedulerService.scheduleFixedDelayClustered(10 * DateUtils.MILLIS_PER_MINUTE, vsJobDefinition); } @Override diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java index 247b3acfe9c..f151effa888 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java @@ -266,7 +266,7 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { ScheduledJobDefinition jobDefinition = new ScheduledJobDefinition(); jobDefinition.setId(BaseTermReadSvcImpl.class.getName() + "_saveDeferred"); jobDefinition.setJobClass(SaveDeferredJob.class); - mySchedulerService.scheduleFixedDelay(SCHEDULE_INTERVAL_MILLIS, false, jobDefinition); + mySchedulerService.scheduleFixedDelayLocal(SCHEDULE_INTERVAL_MILLIS, jobDefinition); } @VisibleForTesting diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java index cbc7b9b4e92..961840cd13f 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java @@ -156,7 +156,7 @@ public class TermReindexingSvcImpl implements ITermReindexingSvc { ScheduledJobDefinition jobDefinition = new ScheduledJobDefinition(); jobDefinition.setId(TermReindexingSvcImpl.class.getName() + "_reindex"); jobDefinition.setJobClass(SaveDeferredJob.class); - mySchedulerService.scheduleFixedDelay(SCHEDULE_INTERVAL_MILLIS, false, jobDefinition); + mySchedulerService.scheduleFixedDelayLocal(SCHEDULE_INTERVAL_MILLIS, jobDefinition); } public static class SaveDeferredJob extends FireAtIntervalJob { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java index 843736034fd..e6a3844646d 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java @@ -96,7 +96,7 @@ public class ResourceCountCache { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(ResourceCountCache.class.getName()); jobDetail.setJobClass(ResourceCountCache.SubmitJob.class); - mySchedulerService.scheduleFixedDelay(10 * DateUtils.MILLIS_PER_MINUTE, false, jobDetail); + mySchedulerService.scheduleFixedDelayLocal(10 * DateUtils.MILLIS_PER_MINUTE, jobDetail); } public static class SubmitJob implements Job { diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java index 8409ea0c049..0c741d693c8 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java @@ -10,7 +10,6 @@ import org.junit.runner.RunWith; import org.quartz.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.BeanUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -18,7 +17,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.data.util.ProxyUtils; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.util.AopTestUtils; @@ -50,7 +48,7 @@ public class SchedulerServiceImplTest { .setId(CountingJob.class.getName()) .setJobClass(CountingJob.class); - mySvc.scheduleFixedDelay(100, false, def); + mySvc.scheduleFixedDelayLocal(100, def); sleepAtLeast(1000); @@ -69,10 +67,10 @@ public class SchedulerServiceImplTest { SchedulerServiceImpl svc = AopTestUtils.getTargetObject(mySvc); svc.stop(); + svc.create(); svc.start(); - svc.contextStarted(null); - mySvc.scheduleFixedDelay(100, false, def); + mySvc.scheduleFixedDelayLocal(100, def); sleepAtLeast(1000); @@ -90,7 +88,7 @@ public class SchedulerServiceImplTest { .setJobClass(CountingJob.class); ourTaskDelay = 500; - mySvc.scheduleFixedDelay(100, false, def); + mySvc.scheduleFixedDelayLocal(100, def); sleepAtLeast(1000); @@ -108,7 +106,7 @@ public class SchedulerServiceImplTest { .setJobClass(CountingIntervalJob.class); ourTaskDelay = 500; - mySvc.scheduleFixedDelay(100, false, def); + mySvc.scheduleFixedDelayLocal(100, def); sleepAtLeast(2000); diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/subscription/resthook/SubscriptionTriggeringDstu3Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/subscription/resthook/SubscriptionTriggeringDstu3Test.java index 1cfc1e5896f..6d1d9169235 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/subscription/resthook/SubscriptionTriggeringDstu3Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/subscription/resthook/SubscriptionTriggeringDstu3Test.java @@ -3,11 +3,11 @@ package ca.uhn.fhir.jpa.subscription.resthook; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.jpa.dao.DaoConfig; import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.util.JpaConstants; import ca.uhn.fhir.jpa.provider.SubscriptionTriggeringProvider; import ca.uhn.fhir.jpa.provider.dstu3.BaseResourceProviderDstu3Test; import ca.uhn.fhir.jpa.subscription.SubscriptionTestUtil; import ca.uhn.fhir.jpa.subscription.SubscriptionTriggeringSvcImpl; -import ca.uhn.fhir.jpa.model.util.JpaConstants; import ca.uhn.fhir.rest.annotation.Create; import ca.uhn.fhir.rest.annotation.ResourceParam; import ca.uhn.fhir.rest.annotation.Update; @@ -16,6 +16,7 @@ import ca.uhn.fhir.rest.api.MethodOutcome; import ca.uhn.fhir.rest.server.IResourceProvider; import ca.uhn.fhir.rest.server.RestfulServer; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; +import ca.uhn.fhir.test.utilities.JettyUtil; import com.google.common.collect.Lists; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; @@ -34,8 +35,6 @@ import java.util.List; import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.*; -import ca.uhn.fhir.test.utilities.JettyUtil; - /** * Test the rest-hook subscriptions */ @@ -101,7 +100,7 @@ public class SubscriptionTriggeringDstu3Test extends BaseResourceProviderDstu3Te ourUpdatedPatients.clear(); ourContentTypes.clear(); - mySchedulerService.logStatus(); + mySchedulerService.logStatusForUnitTest(); } private Subscription createSubscription(String theCriteria, String thePayload, String theEndpoint) throws InterruptedException { diff --git a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISchedulerService.java b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISchedulerService.java index 599b12a9ead..a5446cbb67b 100644 --- a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISchedulerService.java +++ b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISchedulerService.java @@ -28,14 +28,21 @@ public interface ISchedulerService { @VisibleForTesting void purgeAllScheduledJobsForUnitTest() throws SchedulerException; - void logStatus(); + void logStatusForUnitTest(); /** + * Only one instance of this task will fire across the whole cluster (when running in a clustered environment). * @param theIntervalMillis How many milliseconds between passes should this job run - * @param theClusteredTask If true, only one instance of this task will fire across the whole cluster (when running in a clustered environment). If false, or if not running in a clustered environment, this task will execute locally (and should execute on all nodes of the cluster) * @param theJobDefinition The Job to fire */ - void scheduleFixedDelay(long theIntervalMillis, boolean theClusteredTask, ScheduledJobDefinition theJobDefinition); + void scheduleFixedDelayLocal(long theIntervalMillis, ScheduledJobDefinition theJobDefinition); + + /** + * This task will execute locally (and should execute on all nodes of the cluster if there is a cluster) + * @param theIntervalMillis How many milliseconds between passes should this job run + * @param theJobDefinition The Job to fire + */ + void scheduleFixedDelayClustered(long theIntervalMillis, ScheduledJobDefinition theJobDefinition); boolean isStopping(); } diff --git a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java index d9875583e24..a29253ac7f4 100644 --- a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java +++ b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java @@ -47,11 +47,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; import org.hl7.fhir.dstu3.model.Extension; import org.hl7.fhir.dstu3.model.SearchParameter; -import org.hl7.fhir.instance.model.api.IBaseExtension; -import org.hl7.fhir.instance.model.api.IBaseHasExtensions; -import org.hl7.fhir.instance.model.api.IBaseResource; -import org.hl7.fhir.instance.model.api.IIdType; -import org.hl7.fhir.instance.model.api.IPrimitiveType; +import org.hl7.fhir.instance.model.api.*; import org.hl7.fhir.r4.model.Reference; import org.quartz.Job; import org.quartz.JobExecutionContext; @@ -60,14 +56,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import javax.annotation.PostConstruct; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import static org.apache.commons.lang3.StringUtils.isBlank; @@ -739,7 +728,7 @@ public class SearchParamRegistryImpl implements ISearchParamRegistry { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(SearchParamRegistryImpl.class.getName()); jobDetail.setJobClass(SubmitJob.class); - mySchedulerService.scheduleFixedDelay(10 * DateUtils.MILLIS_PER_SECOND, false, jobDetail); + mySchedulerService.scheduleFixedDelayLocal(10 * DateUtils.MILLIS_PER_SECOND, jobDetail); } @Override diff --git a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java index 1f5e4ae998b..5ff6e90b186 100644 --- a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java +++ b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java @@ -94,7 +94,7 @@ public class SubscriptionLoader { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(SubscriptionLoader.class.getName()); jobDetail.setJobClass(SubscriptionLoader.SubmitJob.class); - mySchedulerService.scheduleFixedDelay(REFRESH_INTERVAL, false, jobDetail); + mySchedulerService.scheduleFixedDelayLocal(REFRESH_INTERVAL, jobDetail); } @VisibleForTesting diff --git a/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java b/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java index b21b6b27050..93958633bcf 100644 --- a/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java +++ b/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java @@ -70,7 +70,7 @@ public class AnalyticsInterceptor extends InterceptorAdapter { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(getClass().getName()); jobDetail.setJobClass(SubmitJob.class); - mySchedulerService.scheduleFixedDelay(5000, false, jobDetail); + mySchedulerService.scheduleFixedDelayLocal(5000, jobDetail); } @PreDestroy From f3535a2befd1b25d009b8344e46a0492517dd66f Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Tue, 19 Nov 2019 13:32:20 -0500 Subject: [PATCH 02/34] split scheduler from service --- .../uhn/fhir/jpa/sched/BaseHapiScheduler.java | 161 ++++++++++ .../jpa/sched/ClusteredHapiScheduler.java | 18 ++ .../uhn/fhir/jpa/sched/HapiNullScheduler.java | 45 +++ .../ca/uhn/fhir/jpa/sched/IHapiScheduler.java | 20 ++ .../fhir/jpa/sched/LocalHapiScheduler.java | 18 ++ .../ca/uhn/fhir/jpa/sched/NullScheduler.java | 294 +----------------- .../fhir/jpa/sched/SchedulerServiceImpl.java | 180 ++--------- 7 files changed, 294 insertions(+), 442 deletions(-) create mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java create mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/ClusteredHapiScheduler.java create mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java create mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/IHapiScheduler.java create mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/LocalHapiScheduler.java diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java new file mode 100644 index 00000000000..48b82e533c9 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java @@ -0,0 +1,161 @@ +package ca.uhn.fhir.jpa.sched; + +import ca.uhn.fhir.context.ConfigurationException; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; +import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; +import com.google.common.collect.Sets; +import org.apache.commons.lang3.Validate; +import org.quartz.*; +import org.quartz.impl.JobDetailImpl; +import org.quartz.impl.StdSchedulerFactory; +import org.quartz.impl.matchers.GroupMatcher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Properties; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +import static org.quartz.impl.StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME; + +public abstract class BaseHapiScheduler implements IHapiScheduler { + private static final Logger ourLog = LoggerFactory.getLogger(BaseHapiScheduler.class); + + private static final AtomicInteger ourNextSchedulerId = new AtomicInteger(); + + private final String myThreadNamePrefix; + private final AutowiringSpringBeanJobFactory mySpringBeanJobFactory; + private final StdSchedulerFactory myFactory = new StdSchedulerFactory(); + private final Properties myProperties = new Properties(); + + private Scheduler myScheduler; + + public BaseHapiScheduler(String theThreadNamePrefix, AutowiringSpringBeanJobFactory theSpringBeanJobFactory) { + myThreadNamePrefix = theThreadNamePrefix; + mySpringBeanJobFactory = theSpringBeanJobFactory; + } + + + void setInstanceName(String theName) { + myProperties.setProperty(PROP_SCHED_INSTANCE_NAME, theName + "-" + nextSchedulerId()); + } + + + int nextSchedulerId() { + return ourNextSchedulerId.getAndIncrement(); + } + + @Override + public void init() throws SchedulerException { + setProperties(); + myFactory.initialize(myProperties); + myScheduler = myFactory.getScheduler(); + myScheduler.setJobFactory(mySpringBeanJobFactory); + myScheduler.standby(); + } + + private void setProperties() { + myProperties.put("org.quartz.threadPool.threadCount", "4"); + myProperties.put("org.quartz.threadPool.threadNamePrefix", myThreadNamePrefix + "-" + myProperties.get(PROP_SCHED_INSTANCE_NAME)); + addProperties(myProperties); + } + + @Override + public void start() { + try { + myScheduler.start(); + } catch (SchedulerException e) { + ourLog.error("Failed to start up scheduler"); + throw new ConfigurationException("Failed to start up scheduler", e); + } + } + + @Override + public void shutdown() { + try { + myScheduler.shutdown(true); + } catch (SchedulerException e) { + ourLog.error("Failed to shut down scheduler"); + throw new ConfigurationException("Failed to shut down scheduler", e); + } + } + + @Override + public boolean isStarted() { + try { + return myScheduler.isStarted(); + } catch (SchedulerException e) { + ourLog.error("Failed to determine scheduler status"); + return false; + } + } + + @Override + public void clear() throws SchedulerException { + myScheduler.clear(); + } + + @Override + public void logStatusForUnitTest() { + try { + Set keys = myScheduler.getJobKeys(GroupMatcher.anyGroup()); + String keysString = keys.stream().map(t -> t.getName()).collect(Collectors.joining(", ")); + ourLog.info("Local scheduler has jobs: {}", keysString); + } catch (SchedulerException e) { + ourLog.error("Failed to get log status for scheduler", e); + throw new InternalErrorException("Failed to get log status for scheduler", e); + } + } + + @Override + public void scheduleFixedDelay(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { + Validate.isTrue(theIntervalMillis >= 100); + + Validate.notNull(theJobDefinition); + Validate.notNull(theJobDefinition.getJobClass()); + Validate.notBlank(theJobDefinition.getId()); + + JobKey jobKey = new JobKey(theJobDefinition.getId()); + + JobDetailImpl jobDetail = new NonConcurrentJobDetailImpl(); + jobDetail.setJobClass(theJobDefinition.getJobClass()); + jobDetail.setKey(jobKey); + jobDetail.setName(theJobDefinition.getId()); + jobDetail.setJobDataMap(new JobDataMap(theJobDefinition.getJobData())); + + ScheduleBuilder schedule = SimpleScheduleBuilder + .simpleSchedule() + .withIntervalInMilliseconds(theIntervalMillis) + .repeatForever(); + + Trigger trigger = TriggerBuilder.newTrigger() + .forJob(jobDetail) + .startNow() + .withSchedule(schedule) + .build(); + + Set triggers = Sets.newHashSet(trigger); + try { + myScheduler.scheduleJob(jobDetail, triggers, true); + } catch (SchedulerException e) { + ourLog.error("Failed to schedule job", e); + throw new InternalErrorException(e); + } + + } + + private static class NonConcurrentJobDetailImpl extends JobDetailImpl { + private static final long serialVersionUID = 5716197221121989740L; + + // All HAPI FHIR jobs shouldn't allow concurrent execution + @Override + public boolean isConcurrentExectionDisallowed() { + return true; + } + } + + abstract void addProperties(Properties theProperties); +// FIXME KHS +// quartzPropertiesClustered(clusteredProperties); +} diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/ClusteredHapiScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/ClusteredHapiScheduler.java new file mode 100644 index 00000000000..4e02813c2bc --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/ClusteredHapiScheduler.java @@ -0,0 +1,18 @@ +package ca.uhn.fhir.jpa.sched; + +import java.util.Properties; + +public class ClusteredHapiScheduler extends BaseHapiScheduler { + public ClusteredHapiScheduler(String theThreadNamePrefix, AutowiringSpringBeanJobFactory theSpringBeanJobFactory) { + super(theThreadNamePrefix, theSpringBeanJobFactory); + setInstanceName("clustered"); + } + + /** + * Properties for the cluster scheduler (see the class docs to learn what this means) + */ + @Override + void addProperties(Properties theProperties) { +// theProperties.put("org.quartz.jobStore.tablePrefix", "QRTZHFJC_"); + } +} diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java new file mode 100644 index 00000000000..d9a88182f04 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java @@ -0,0 +1,45 @@ +package ca.uhn.fhir.jpa.sched; + +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; +import org.quartz.SchedulerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HapiNullScheduler implements IHapiScheduler { + private static final Logger ourLog = LoggerFactory.getLogger(HapiNullScheduler.class); + + @Override + public void init() { + // nothing + } + + @Override + public void start() { + + } + + @Override + public void shutdown() { + + } + + @Override + public boolean isStarted() { + return true; + } + + @Override + public void clear() throws SchedulerException { + + } + + @Override + public void logStatusForUnitTest() { + + } + + @Override + public void scheduleFixedDelay(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { + ourLog.debug("Skipping scheduling job {} since scheduling is disabled", theJobDefinition.getId()); + } +} diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/IHapiScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/IHapiScheduler.java new file mode 100644 index 00000000000..2338af8f404 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/IHapiScheduler.java @@ -0,0 +1,20 @@ +package ca.uhn.fhir.jpa.sched; + +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; +import org.quartz.SchedulerException; + +public interface IHapiScheduler { + void init() throws SchedulerException; + + void start(); + + void shutdown(); + + boolean isStarted(); + + void clear() throws SchedulerException; + + void logStatusForUnitTest(); + + void scheduleFixedDelay(long theIntervalMillis, ScheduledJobDefinition theJobDefinition); +} diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/LocalHapiScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/LocalHapiScheduler.java new file mode 100644 index 00000000000..84b25de2282 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/LocalHapiScheduler.java @@ -0,0 +1,18 @@ +package ca.uhn.fhir.jpa.sched; + +import java.util.Properties; + +public class LocalHapiScheduler extends BaseHapiScheduler { + public LocalHapiScheduler(String theThreadNamePrefix, AutowiringSpringBeanJobFactory theSpringBeanJobFactory) { + super(theThreadNamePrefix, theSpringBeanJobFactory); + setInstanceName("local"); + } + + /** + * Properties for the local scheduler (see the class docs to learn what this means) + */ + @Override + void addProperties(Properties theProperties) { + // nothing + } +} diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java index ef207449b4f..5c059e846c1 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java @@ -1,297 +1,15 @@ package ca.uhn.fhir.jpa.sched; -import org.quartz.*; -import org.quartz.impl.matchers.GroupMatcher; -import org.quartz.spi.JobFactory; +import java.util.Properties; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Set; +class NullScheduler extends BaseHapiScheduler { -class NullScheduler implements Scheduler { - @Override - public String getSchedulerName() { - return null; + public NullScheduler(String theThreadNamePrefix, AutowiringSpringBeanJobFactory theSpringBeanJobFactory) { + super(theThreadNamePrefix, theSpringBeanJobFactory); } @Override - public String getSchedulerInstanceId() { - return null; - } - - @Override - public SchedulerContext getContext() { - return null; - } - - @Override - public void start() { - - } - - @Override - public void startDelayed(int seconds) { - - } - - @Override - public boolean isStarted() { - return false; - } - - @Override - public void standby() { - - } - - @Override - public boolean isInStandbyMode() { - return false; - } - - @Override - public void shutdown() { - - } - - @Override - public void shutdown(boolean waitForJobsToComplete) { - - } - - @Override - public boolean isShutdown() { - return false; - } - - @Override - public SchedulerMetaData getMetaData() { - return null; - } - - @Override - public List getCurrentlyExecutingJobs() { - return null; - } - - @Override - public void setJobFactory(JobFactory factory) { - - } - - @Override - public ListenerManager getListenerManager() { - return null; - } - - @Override - public Date scheduleJob(JobDetail jobDetail, Trigger trigger) { - return null; - } - - @Override - public Date scheduleJob(Trigger trigger) { - return null; - } - - @Override - public void scheduleJobs(Map> triggersAndJobs, boolean replace) { - - } - - @Override - public void scheduleJob(JobDetail jobDetail, Set triggersForJob, boolean replace) { - - } - - @Override - public boolean unscheduleJob(TriggerKey triggerKey) { - return false; - } - - @Override - public boolean unscheduleJobs(List triggerKeys) { - return false; - } - - @Override - public Date rescheduleJob(TriggerKey triggerKey, Trigger newTrigger) { - return null; - } - - @Override - public void addJob(JobDetail jobDetail, boolean replace) { - - } - - @Override - public void addJob(JobDetail jobDetail, boolean replace, boolean storeNonDurableWhileAwaitingScheduling) { - - } - - @Override - public boolean deleteJob(JobKey jobKey) { - return false; - } - - @Override - public boolean deleteJobs(List jobKeys) { - return false; - } - - @Override - public void triggerJob(JobKey jobKey) { - - } - - @Override - public void triggerJob(JobKey jobKey, JobDataMap data) { - - } - - @Override - public void pauseJob(JobKey jobKey) { - - } - - @Override - public void pauseJobs(GroupMatcher matcher) { - - } - - @Override - public void pauseTrigger(TriggerKey triggerKey) { - - } - - @Override - public void pauseTriggers(GroupMatcher matcher) { - - } - - @Override - public void resumeJob(JobKey jobKey) { - - } - - @Override - public void resumeJobs(GroupMatcher matcher) { - - } - - @Override - public void resumeTrigger(TriggerKey triggerKey) { - - } - - @Override - public void resumeTriggers(GroupMatcher matcher) { - - } - - @Override - public void pauseAll() { - - } - - @Override - public void resumeAll() { - - } - - @Override - public List getJobGroupNames() { - return null; - } - - @Override - public Set getJobKeys(GroupMatcher matcher) { - return null; - } - - @Override - public List getTriggersOfJob(JobKey jobKey) { - return null; - } - - @Override - public List getTriggerGroupNames() { - return null; - } - - @Override - public Set getTriggerKeys(GroupMatcher matcher) { - return null; - } - - @Override - public Set getPausedTriggerGroups() { - return null; - } - - @Override - public JobDetail getJobDetail(JobKey jobKey) { - return null; - } - - @Override - public Trigger getTrigger(TriggerKey triggerKey) { - return null; - } - - @Override - public Trigger.TriggerState getTriggerState(TriggerKey triggerKey) { - return null; - } - - @Override - public void resetTriggerFromErrorState(TriggerKey triggerKey) { - - } - - @Override - public void addCalendar(String calName, Calendar calendar, boolean replace, boolean updateTriggers) { - - } - - @Override - public boolean deleteCalendar(String calName) { - return false; - } - - @Override - public Calendar getCalendar(String calName) { - return null; - } - - @Override - public List getCalendarNames() { - return null; - } - - @Override - public boolean interrupt(JobKey jobKey) throws UnableToInterruptJobException { - return false; - } - - @Override - public boolean interrupt(String fireInstanceId) throws UnableToInterruptJobException { - return false; - } - - @Override - public boolean checkExists(JobKey jobKey) { - return false; - } - - @Override - public boolean checkExists(TriggerKey triggerKey) { - return false; - } - - @Override - public void clear() { - + void addProperties(Properties theProperties) { + //nothing } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java index d97a47e0a57..0cbfdc5fc80 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java @@ -24,13 +24,7 @@ import ca.uhn.fhir.context.ConfigurationException; import ca.uhn.fhir.jpa.model.sched.ISchedulerService; import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.model.api.ISmartLifecyclePhase; -import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; -import com.google.common.collect.Sets; -import org.apache.commons.lang3.Validate; -import org.quartz.*; -import org.quartz.impl.JobDetailImpl; -import org.quartz.impl.StdSchedulerFactory; -import org.quartz.impl.matchers.GroupMatcher; +import org.quartz.SchedulerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -39,13 +33,7 @@ import org.springframework.context.SmartLifecycle; import org.springframework.core.env.Environment; import javax.annotation.PostConstruct; -import java.util.Properties; -import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; - -import static org.quartz.impl.StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME; /** * This class provides task scheduling for the entire module using the Quartz library. @@ -69,13 +57,13 @@ public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { public static final String SCHEDULING_DISABLED_EQUALS_TRUE = SCHEDULING_DISABLED + "=true"; private static final Logger ourLog = LoggerFactory.getLogger(SchedulerServiceImpl.class); - private static AtomicInteger ourNextSchedulerId = new AtomicInteger(); - private Scheduler myLocalScheduler; - private Scheduler myClusteredScheduler; - private String myThreadNamePrefix; + public static final String THREAD_NAME_PREFIX = "hapi-fhir-jpa-scheduler"; + private IHapiScheduler myLocalScheduler; + private IHapiScheduler myClusteredScheduler; private boolean myLocalSchedulingEnabled; private boolean myClusteredSchedulingEnabled; private AtomicBoolean myStopping = new AtomicBoolean(false); + @Autowired private AutowiringSpringBeanJobFactory mySpringBeanJobFactory; @Autowired @@ -87,7 +75,6 @@ public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { * Constructor */ public SchedulerServiceImpl() { - setThreadNamePrefix("hapi-fhir-jpa-scheduler"); setLocalSchedulingEnabled(true); setClusteredSchedulingEnabled(true); } @@ -108,55 +95,25 @@ public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { myClusteredSchedulingEnabled = theClusteredSchedulingEnabled; } - public String getThreadNamePrefix() { - return myThreadNamePrefix; - } - - public void setThreadNamePrefix(String theThreadNamePrefix) { - myThreadNamePrefix = theThreadNamePrefix; - } - @PostConstruct public void create() throws SchedulerException { - myLocalScheduler = createLocalScheduler(); - myClusteredScheduler = createClusteredScheduler(); + myLocalScheduler = createScheduler(false); + myClusteredScheduler = createScheduler(true); myStopping.set(false); } - private Scheduler createLocalScheduler() throws SchedulerException { + private IHapiScheduler createScheduler(boolean theClustered) throws SchedulerException { if (!isLocalSchedulingEnabled() || isSchedulingDisabledForUnitTests()) { - return new NullScheduler(); + return new HapiNullScheduler(); } - Properties localProperties = new Properties(); - localProperties.setProperty(PROP_SCHED_INSTANCE_NAME, "local-" + ourNextSchedulerId.getAndIncrement()); - quartzPropertiesCommon(localProperties); - quartzPropertiesLocal(localProperties); - StdSchedulerFactory factory = new StdSchedulerFactory(); - factory.initialize(localProperties); - Scheduler scheduler = factory.getScheduler(); - configureSchedulerCommon(scheduler); - scheduler.standby(); - return scheduler; - } - - private Scheduler createClusteredScheduler() throws SchedulerException { - if (!isClusteredSchedulingEnabled() || isSchedulingDisabledForUnitTests()) { - return new NullScheduler(); + IHapiScheduler retval; + if (theClustered) { + retval = new ClusteredHapiScheduler(THREAD_NAME_PREFIX, mySpringBeanJobFactory); + } else { + retval = new LocalHapiScheduler(THREAD_NAME_PREFIX, mySpringBeanJobFactory); } - Properties clusteredProperties = new Properties(); - clusteredProperties.setProperty(PROP_SCHED_INSTANCE_NAME, "clustered-" + ourNextSchedulerId.getAndIncrement()); - quartzPropertiesCommon(clusteredProperties); - quartzPropertiesClustered(clusteredProperties); - StdSchedulerFactory factory = new StdSchedulerFactory(); - factory.initialize(clusteredProperties); - Scheduler scheduler = factory.getScheduler(); - configureSchedulerCommon(scheduler); - scheduler.standby(); - return scheduler; - } - - private void configureSchedulerCommon(Scheduler theScheduler) throws SchedulerException { - theScheduler.setJobFactory(mySpringBeanJobFactory); + retval.init(); + return retval; } /** @@ -190,23 +147,13 @@ public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { ourLog.info("Shutting down task scheduler..."); myStopping.set(true); - try { - myLocalScheduler.shutdown(true); - myClusteredScheduler.shutdown(true); - } catch (SchedulerException e) { - ourLog.error("Failed to shut down scheduler"); - throw new ConfigurationException("Failed to shut down scheduler", e); - } + myLocalScheduler.shutdown(); + myClusteredScheduler.shutdown(); } @Override public boolean isRunning() { - try { - return !myStopping.get() && myLocalScheduler.isStarted() && myClusteredScheduler.isStarted(); - } catch (SchedulerException e) { - ourLog.error("Failed to determine scheduler status", e); - return false; - } + return !myStopping.get() && myLocalScheduler.isStarted() && myClusteredScheduler.isStarted(); } @Override @@ -217,87 +164,18 @@ public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { @Override public void logStatusForUnitTest() { - try { - Set keys = myLocalScheduler.getJobKeys(GroupMatcher.anyGroup()); - String keysString = keys.stream().map(t -> t.getName()).collect(Collectors.joining(", ")); - ourLog.info("Local scheduler has jobs: {}", keysString); - - keys = myClusteredScheduler.getJobKeys(GroupMatcher.anyGroup()); - keysString = keys.stream().map(t -> t.getName()).collect(Collectors.joining(", ")); - ourLog.info("Clustered scheduler has jobs: {}", keysString); - } catch (SchedulerException e) { - throw new InternalErrorException(e); - } + myLocalScheduler.logStatusForUnitTest(); + myClusteredScheduler.logStatusForUnitTest(); } @Override public void scheduleFixedDelayLocal(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { - scheduleFixedDelay(theIntervalMillis, myLocalScheduler, theJobDefinition); + myLocalScheduler.scheduleFixedDelay(theIntervalMillis, theJobDefinition); } @Override public void scheduleFixedDelayClustered(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { - scheduleFixedDelay(theIntervalMillis, myClusteredScheduler, theJobDefinition); - } - - private void scheduleFixedDelay(long theIntervalMillis, Scheduler theScheduler, ScheduledJobDefinition theJobDefinition) { - Validate.isTrue(theIntervalMillis >= 100); - - Validate.notNull(theJobDefinition); - Validate.notNull(theJobDefinition.getJobClass()); - Validate.notBlank(theJobDefinition.getId()); - - JobKey jobKey = new JobKey(theJobDefinition.getId()); - - JobDetailImpl jobDetail = new NonConcurrentJobDetailImpl(); - jobDetail.setJobClass(theJobDefinition.getJobClass()); - jobDetail.setKey(jobKey); - jobDetail.setName(theJobDefinition.getId()); - jobDetail.setJobDataMap(new JobDataMap(theJobDefinition.getJobData())); - - ScheduleBuilder schedule = SimpleScheduleBuilder - .simpleSchedule() - .withIntervalInMilliseconds(theIntervalMillis) - .repeatForever(); - - Trigger trigger = TriggerBuilder.newTrigger() - .forJob(jobDetail) - .startNow() - .withSchedule(schedule) - .build(); - - Set triggers = Sets.newHashSet(trigger); - try { - theScheduler.scheduleJob(jobDetail, triggers, true); - } catch (SchedulerException e) { - ourLog.error("Failed to schedule job", e); - throw new InternalErrorException(e); - } - - } - - @Override - public boolean isStopping() { - return myStopping.get(); - } - - /** - * Properties for the local scheduler (see the class docs to learn what this means) - */ - protected void quartzPropertiesLocal(Properties theProperties) { - // nothing - } - - /** - * Properties for the cluster scheduler (see the class docs to learn what this means) - */ - protected void quartzPropertiesClustered(Properties theProperties) { -// theProperties.put("org.quartz.jobStore.tablePrefix", "QRTZHFJC_"); - } - - protected void quartzPropertiesCommon(Properties theProperties) { - theProperties.put("org.quartz.threadPool.threadCount", "4"); - theProperties.put("org.quartz.threadPool.threadNamePrefix", getThreadNamePrefix() + "-" + theProperties.get(PROP_SCHED_INSTANCE_NAME)); + myClusteredScheduler.scheduleFixedDelay(theIntervalMillis, theJobDefinition); } private boolean isSchedulingDisabledForUnitTests() { @@ -305,15 +183,9 @@ public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { return "true".equals(schedulingDisabled); } - private static class NonConcurrentJobDetailImpl extends JobDetailImpl { - private static final long serialVersionUID = 5716197221121989740L; - - // All HAPI FHIR jobs shouldn't allow concurrent execution - @Override - public boolean isConcurrentExectionDisallowed() { - return true; - } + @Override + public boolean isStopping() { + return myStopping.get(); } - } From b73cdbcaf58e69167939832db0b732af09a9a093 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Tue, 19 Nov 2019 17:23:06 -0500 Subject: [PATCH 03/34] add factory --- .../ca/uhn/fhir/jpa/config/BaseConfig.java | 14 ++++++-------- .../uhn/fhir/jpa/sched/SchedulerFactory.java | 18 ++++++++++++++++++ .../fhir/jpa/sched/SchedulerServiceImpl.java | 7 +++---- .../jpa/sched/SchedulerServiceImplTest.java | 5 +++++ 4 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerFactory.java diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java index 0fdb7f9de30..c664575228e 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java @@ -10,13 +10,13 @@ import ca.uhn.fhir.jpa.bulk.BulkDataExportProvider; import ca.uhn.fhir.jpa.bulk.BulkDataExportSvcImpl; import ca.uhn.fhir.jpa.bulk.IBulkDataExportSvc; import ca.uhn.fhir.jpa.dao.DaoRegistry; -import ca.uhn.fhir.jpa.delete.DeleteConflictService; import ca.uhn.fhir.jpa.graphql.JpaStorageServices; import ca.uhn.fhir.jpa.interceptor.JpaConsentContextServices; import ca.uhn.fhir.jpa.model.sched.ISchedulerService; import ca.uhn.fhir.jpa.provider.SubscriptionTriggeringProvider; import ca.uhn.fhir.jpa.provider.TerminologyUploaderProvider; import ca.uhn.fhir.jpa.sched.AutowiringSpringBeanJobFactory; +import ca.uhn.fhir.jpa.sched.SchedulerFactory; import ca.uhn.fhir.jpa.sched.SchedulerServiceImpl; import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider; import ca.uhn.fhir.jpa.search.IStaleSearchDeletingSvc; @@ -36,13 +36,6 @@ import ca.uhn.fhir.jpa.subscription.module.cache.LinkedBlockingQueueSubscribable import ca.uhn.fhir.jpa.subscription.module.channel.ISubscribableChannelFactory; import ca.uhn.fhir.jpa.subscription.module.matcher.ISubscriptionMatcher; import ca.uhn.fhir.jpa.subscription.module.matcher.InMemorySubscriptionMatcher; -import ca.uhn.fhir.jpa.term.TermCodeSystemStorageSvcImpl; -import ca.uhn.fhir.jpa.term.TermDeferredStorageSvcImpl; -import ca.uhn.fhir.jpa.term.api.ITermVersionAdapterSvc; -import ca.uhn.fhir.jpa.term.TermReindexingSvcImpl; -import ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc; -import ca.uhn.fhir.jpa.term.api.ITermDeferredStorageSvc; -import ca.uhn.fhir.jpa.term.api.ITermReindexingSvc; import ca.uhn.fhir.rest.server.interceptor.consent.IConsentContextServices; import org.hibernate.jpa.HibernatePersistenceProvider; import org.hl7.fhir.utilities.graphql.IGraphQLStorageServices; @@ -260,6 +253,11 @@ public abstract class BaseConfig { return new SchedulerServiceImpl(); } + @Bean + public SchedulerFactory schedulerFactory() { + return new SchedulerFactory(); + } + @Bean public AutowiringSpringBeanJobFactory schedulerJobFactory() { return new AutowiringSpringBeanJobFactory(); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerFactory.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerFactory.java new file mode 100644 index 00000000000..b525d1add5d --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerFactory.java @@ -0,0 +1,18 @@ +package ca.uhn.fhir.jpa.sched; + +import org.springframework.beans.factory.annotation.Autowired; + +public class SchedulerFactory { + public static final String THREAD_NAME_PREFIX = "hapi-fhir-jpa-scheduler"; + + @Autowired + private AutowiringSpringBeanJobFactory mySpringBeanJobFactory; + + public IHapiScheduler newClusteredHapiScheduler() { + return new ClusteredHapiScheduler(THREAD_NAME_PREFIX, mySpringBeanJobFactory); + } + + public IHapiScheduler newLocalHapiScheduler() { + return new LocalHapiScheduler(THREAD_NAME_PREFIX, mySpringBeanJobFactory); + } +} diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java index 0cbfdc5fc80..c287ff0936b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java @@ -57,7 +57,6 @@ public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { public static final String SCHEDULING_DISABLED_EQUALS_TRUE = SCHEDULING_DISABLED + "=true"; private static final Logger ourLog = LoggerFactory.getLogger(SchedulerServiceImpl.class); - public static final String THREAD_NAME_PREFIX = "hapi-fhir-jpa-scheduler"; private IHapiScheduler myLocalScheduler; private IHapiScheduler myClusteredScheduler; private boolean myLocalSchedulingEnabled; @@ -65,7 +64,7 @@ public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { private AtomicBoolean myStopping = new AtomicBoolean(false); @Autowired - private AutowiringSpringBeanJobFactory mySpringBeanJobFactory; + private SchedulerFactory mySchedulerFactory; @Autowired private Environment myEnvironment; @Autowired @@ -108,9 +107,9 @@ public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { } IHapiScheduler retval; if (theClustered) { - retval = new ClusteredHapiScheduler(THREAD_NAME_PREFIX, mySpringBeanJobFactory); + retval = mySchedulerFactory.newClusteredHapiScheduler(); } else { - retval = new LocalHapiScheduler(THREAD_NAME_PREFIX, mySpringBeanJobFactory); + retval = mySchedulerFactory.newLocalHapiScheduler(); } retval.init(); return retval; diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java index 0c741d693c8..28921ce2fe3 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java @@ -191,6 +191,11 @@ public class SchedulerServiceImplTest { return new SchedulerServiceImpl(); } + @Bean + public SchedulerFactory schedulerFactory() { + return new SchedulerFactory(); + } + @Bean public String stringBean() { return "String beans are good."; From 6f9cd56c8161b1285bf8fb2bb77976a1928817ca Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Wed, 20 Nov 2019 14:30:24 -0500 Subject: [PATCH 04/34] moved scheduler up to hapi-server --- hapi-fhir-base/pom.xml | 5 +++++ hapi-fhir-jpaserver-base/pom.xml | 7 ------- .../java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java | 4 ++-- .../src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java | 9 +++++---- .../java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java | 3 ++- .../java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java | 3 ++- .../{SchedulerFactory.java => HapiSchedulerFactory.java} | 4 +++- .../java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java | 8 +++++--- .../uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java | 4 ++-- .../fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java | 4 ++-- .../jpa/search/reindex/ResourceReindexingSvcImpl.java | 4 ++-- .../ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java | 4 ++-- .../jpa/subscription/SubscriptionTriggeringSvcImpl.java | 4 ++-- .../java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java | 4 ++-- .../ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java | 4 ++-- .../java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java | 4 ++-- .../java/ca/uhn/fhir/jpa/util/ResourceCountCache.java | 4 ++-- .../ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java | 9 +++++---- .../resthook/SubscriptionTriggeringDstu3Test.java | 2 +- .../searchparam/registry/SearchParamRegistryImpl.java | 4 ++-- .../registry/SearchParamRegistryImplTest.java | 7 +++---- .../subscription/module/cache/SubscriptionLoader.java | 4 ++-- .../module/config/TestSubscriptionDstu3Config.java | 7 +++++-- .../uhn/fhirtest/interceptor/AnalyticsInterceptor.java | 4 ++-- .../ca/uhn/fhir/rest/server}/sched/IHapiScheduler.java | 3 +-- .../ca/uhn/fhir/rest/server/sched/ISchedulerFactory.java | 7 +++++++ .../uhn/fhir/rest/server}/sched/ISchedulerService.java | 2 +- .../fhir/rest/server}/sched/ScheduledJobDefinition.java | 2 +- 28 files changed, 72 insertions(+), 58 deletions(-) rename hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/{SchedulerFactory.java => HapiSchedulerFactory.java} (74%) rename {hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa => hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server}/sched/IHapiScheduler.java (79%) create mode 100644 hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerFactory.java rename {hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model => hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server}/sched/ISchedulerService.java (97%) rename {hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model => hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server}/sched/ScheduledJobDefinition.java (97%) diff --git a/hapi-fhir-base/pom.xml b/hapi-fhir-base/pom.xml index ff88ecbf8b7..e4b8803add8 100644 --- a/hapi-fhir-base/pom.xml +++ b/hapi-fhir-base/pom.xml @@ -115,6 +115,11 @@ logback-classic true + + + org.quartz-scheduler + quartz + org.awaitility diff --git a/hapi-fhir-jpaserver-base/pom.xml b/hapi-fhir-jpaserver-base/pom.xml index 9e5c528be0a..07e6f4def59 100644 --- a/hapi-fhir-jpaserver-base/pom.xml +++ b/hapi-fhir-jpaserver-base/pom.xml @@ -312,13 +312,6 @@ javax.servlet-api provided - - - org.quartz-scheduler - quartz - - - diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java index aae0c2eb27b..e52f2648cc0 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java @@ -33,8 +33,6 @@ import ca.uhn.fhir.jpa.entity.BulkExportCollectionFileEntity; import ca.uhn.fhir.jpa.entity.BulkExportJobEntity; import ca.uhn.fhir.jpa.model.cross.ResourcePersistentId; import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.model.search.SearchRuntimeDetails; import ca.uhn.fhir.jpa.model.util.JpaConstants; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; @@ -45,6 +43,8 @@ import ca.uhn.fhir.rest.param.DateRangeParam; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.BinaryUtil; import ca.uhn.fhir.util.StopWatch; import org.apache.commons.io.FileUtils; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java index c664575228e..7a4a82e228f 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java @@ -12,11 +12,10 @@ import ca.uhn.fhir.jpa.bulk.IBulkDataExportSvc; import ca.uhn.fhir.jpa.dao.DaoRegistry; import ca.uhn.fhir.jpa.graphql.JpaStorageServices; import ca.uhn.fhir.jpa.interceptor.JpaConsentContextServices; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; import ca.uhn.fhir.jpa.provider.SubscriptionTriggeringProvider; import ca.uhn.fhir.jpa.provider.TerminologyUploaderProvider; import ca.uhn.fhir.jpa.sched.AutowiringSpringBeanJobFactory; -import ca.uhn.fhir.jpa.sched.SchedulerFactory; +import ca.uhn.fhir.jpa.sched.HapiSchedulerFactory; import ca.uhn.fhir.jpa.sched.SchedulerServiceImpl; import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider; import ca.uhn.fhir.jpa.search.IStaleSearchDeletingSvc; @@ -37,6 +36,8 @@ import ca.uhn.fhir.jpa.subscription.module.channel.ISubscribableChannelFactory; import ca.uhn.fhir.jpa.subscription.module.matcher.ISubscriptionMatcher; import ca.uhn.fhir.jpa.subscription.module.matcher.InMemorySubscriptionMatcher; import ca.uhn.fhir.rest.server.interceptor.consent.IConsentContextServices; +import ca.uhn.fhir.rest.server.sched.ISchedulerFactory; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; import org.hibernate.jpa.HibernatePersistenceProvider; import org.hl7.fhir.utilities.graphql.IGraphQLStorageServices; import org.springframework.beans.factory.annotation.Autowired; @@ -254,8 +255,8 @@ public abstract class BaseConfig { } @Bean - public SchedulerFactory schedulerFactory() { - return new SchedulerFactory(); + public ISchedulerFactory schedulerFactory() { + return new HapiSchedulerFactory(); } @Bean diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java index 48b82e533c9..775d67f366b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java @@ -1,8 +1,9 @@ package ca.uhn.fhir.jpa.sched; import ca.uhn.fhir.context.ConfigurationException; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; +import ca.uhn.fhir.rest.server.sched.IHapiScheduler; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import com.google.common.collect.Sets; import org.apache.commons.lang3.Validate; import org.quartz.*; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java index d9a88182f04..1a24907098b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java @@ -1,6 +1,7 @@ package ca.uhn.fhir.jpa.sched; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; +import ca.uhn.fhir.rest.server.sched.IHapiScheduler; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import org.quartz.SchedulerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerFactory.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiSchedulerFactory.java similarity index 74% rename from hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerFactory.java rename to hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiSchedulerFactory.java index b525d1add5d..213fa342c24 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerFactory.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiSchedulerFactory.java @@ -1,8 +1,10 @@ package ca.uhn.fhir.jpa.sched; +import ca.uhn.fhir.rest.server.sched.IHapiScheduler; +import ca.uhn.fhir.rest.server.sched.ISchedulerFactory; import org.springframework.beans.factory.annotation.Autowired; -public class SchedulerFactory { +public class HapiSchedulerFactory implements ISchedulerFactory { public static final String THREAD_NAME_PREFIX = "hapi-fhir-jpa-scheduler"; @Autowired diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java index c287ff0936b..7a9f00d8362 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java @@ -21,9 +21,11 @@ package ca.uhn.fhir.jpa.sched; */ import ca.uhn.fhir.context.ConfigurationException; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.model.api.ISmartLifecyclePhase; +import ca.uhn.fhir.rest.server.sched.IHapiScheduler; +import ca.uhn.fhir.rest.server.sched.ISchedulerFactory; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import org.quartz.SchedulerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -64,7 +66,7 @@ public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { private AtomicBoolean myStopping = new AtomicBoolean(false); @Autowired - private SchedulerFactory mySchedulerFactory; + private ISchedulerFactory mySchedulerFactory; @Autowired private Environment myEnvironment; @Autowired diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java index e69bbc68b08..59ed9cad15b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java @@ -21,9 +21,9 @@ package ca.uhn.fhir.jpa.search; */ import ca.uhn.fhir.jpa.dao.DaoConfig; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.search.cache.ISearchCacheSvc; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.springframework.beans.factory.annotation.Autowired; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java index d5d13d8b69b..601e6af2425 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java @@ -21,8 +21,8 @@ package ca.uhn.fhir.jpa.search.cache; */ import ca.uhn.fhir.jpa.entity.Search; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import org.apache.commons.lang3.time.DateUtils; import org.quartz.Job; import org.quartz.JobExecutionContext; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java index cfe624d3ad5..08e6ae1b582 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java @@ -33,11 +33,11 @@ import ca.uhn.fhir.jpa.dao.data.IResourceTableDao; import ca.uhn.fhir.jpa.entity.ResourceReindexJobEntity; import ca.uhn.fhir.jpa.model.entity.ForcedId; import ca.uhn.fhir.jpa.model.entity.ResourceTable; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.searchparam.registry.ISearchParamRegistry; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.ResourceVersionConflictException; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.StopWatch; import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang3.Validate; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java index 7df6430098e..32a81557698 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java @@ -27,10 +27,10 @@ import ca.uhn.fhir.jpa.dao.DaoConfig; import ca.uhn.fhir.jpa.dao.DaoRegistry; import ca.uhn.fhir.jpa.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.searchparam.MatchUrlService; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.UrlUtil; import org.apache.commons.lang3.time.DateUtils; import org.quartz.DisallowConcurrentExecution; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java index 04ce27d09a5..33014515c8a 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java @@ -27,8 +27,6 @@ import ca.uhn.fhir.jpa.dao.DaoRegistry; import ca.uhn.fhir.jpa.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.model.cross.ResourcePersistentId; import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.provider.SubscriptionTriggeringProvider; import ca.uhn.fhir.jpa.search.ISearchCoordinatorSvc; import ca.uhn.fhir.jpa.searchparam.MatchUrlService; @@ -41,6 +39,8 @@ import ca.uhn.fhir.rest.api.server.IBundleProvider; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.ParametersUtil; import ca.uhn.fhir.util.StopWatch; import ca.uhn.fhir.util.UrlUtil; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index b6ef5ffb835..c1cbc34e1b9 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -30,8 +30,6 @@ import ca.uhn.fhir.jpa.entity.*; import ca.uhn.fhir.jpa.entity.TermConceptParentChildLink.RelationshipTypeEnum; import ca.uhn.fhir.jpa.model.cross.ResourcePersistentId; import ca.uhn.fhir.jpa.model.entity.ResourceTable; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermDeferredStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermLoaderSvc; @@ -43,6 +41,8 @@ import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.StopWatch; import ca.uhn.fhir.util.UrlUtil; import ca.uhn.fhir.util.ValidateUtil; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java index f151effa888..e7fdbe4b142 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java @@ -26,11 +26,11 @@ import ca.uhn.fhir.jpa.dao.data.ITermConceptParentChildLinkDao; import ca.uhn.fhir.jpa.entity.TermConcept; import ca.uhn.fhir.jpa.entity.TermConceptParentChildLink; import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermDeferredStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermVersionAdapterSvc; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.StopWatch; import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang3.Validate; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java index 961840cd13f..4b51e11b471 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java @@ -24,11 +24,11 @@ import ca.uhn.fhir.jpa.dao.data.ITermConceptDao; import ca.uhn.fhir.jpa.dao.data.ITermConceptParentChildLinkDao; import ca.uhn.fhir.jpa.entity.TermConcept; import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermDeferredStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermReindexingSvc; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.StopWatch; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ArrayListMultimap; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java index e6a3844646d..3ed6cb79be8 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java @@ -20,9 +20,9 @@ package ca.uhn.fhir.jpa.util; * #L% */ -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang3.time.DateUtils; import org.quartz.Job; diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java index 28921ce2fe3..070283913af 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java @@ -1,8 +1,9 @@ package ca.uhn.fhir.jpa.sched; import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; +import ca.uhn.fhir.rest.server.sched.ISchedulerFactory; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -192,8 +193,8 @@ public class SchedulerServiceImplTest { } @Bean - public SchedulerFactory schedulerFactory() { - return new SchedulerFactory(); + public ISchedulerFactory schedulerFactory() { + return new HapiSchedulerFactory(); } @Bean diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/subscription/resthook/SubscriptionTriggeringDstu3Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/subscription/resthook/SubscriptionTriggeringDstu3Test.java index 6d1d9169235..0fcffcc14ba 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/subscription/resthook/SubscriptionTriggeringDstu3Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/subscription/resthook/SubscriptionTriggeringDstu3Test.java @@ -2,7 +2,6 @@ package ca.uhn.fhir.jpa.subscription.resthook; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.jpa.dao.DaoConfig; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; import ca.uhn.fhir.jpa.model.util.JpaConstants; import ca.uhn.fhir.jpa.provider.SubscriptionTriggeringProvider; import ca.uhn.fhir.jpa.provider.dstu3.BaseResourceProviderDstu3Test; @@ -16,6 +15,7 @@ import ca.uhn.fhir.rest.api.MethodOutcome; import ca.uhn.fhir.rest.server.IResourceProvider; import ca.uhn.fhir.rest.server.RestfulServer; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; import ca.uhn.fhir.test.utilities.JettyUtil; import com.google.common.collect.Lists; import org.eclipse.jetty.server.Server; diff --git a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java index a29253ac7f4..a7b53c2f4e6 100644 --- a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java +++ b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java @@ -27,8 +27,6 @@ import ca.uhn.fhir.interceptor.api.HookParams; import ca.uhn.fhir.interceptor.api.IInterceptorBroadcaster; import ca.uhn.fhir.interceptor.api.Pointcut; import ca.uhn.fhir.jpa.model.entity.ModelConfig; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.model.search.StorageProcessingMessage; import ca.uhn.fhir.jpa.searchparam.JpaRuntimeSearchParam; import ca.uhn.fhir.jpa.searchparam.SearchParamConstants; @@ -38,6 +36,8 @@ import ca.uhn.fhir.model.api.ExtensionDt; import ca.uhn.fhir.rest.api.RestSearchParameterTypeEnum; import ca.uhn.fhir.rest.api.server.IBundleProvider; import ca.uhn.fhir.rest.api.server.RequestDetails; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails; import ca.uhn.fhir.util.DatatypeUtil; import ca.uhn.fhir.util.SearchParameterUtil; diff --git a/hapi-fhir-jpaserver-searchparam/src/test/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImplTest.java b/hapi-fhir-jpaserver-searchparam/src/test/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImplTest.java index 4cb71863129..6b42e5f8c27 100644 --- a/hapi-fhir-jpaserver-searchparam/src/test/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImplTest.java +++ b/hapi-fhir-jpaserver-searchparam/src/test/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImplTest.java @@ -2,12 +2,10 @@ package ca.uhn.fhir.jpa.searchparam.registry; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.RuntimeSearchParam; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; import ca.uhn.fhir.rest.server.SimpleBundleProvider; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; import org.hamcrest.Matchers; -import org.hl7.fhir.instance.model.api.IBaseDatatype; -import org.hl7.fhir.instance.model.api.IBaseExtension; import org.hl7.fhir.instance.model.api.IPrimitiveType; import org.hl7.fhir.r4.model.Enumerations; import org.hl7.fhir.r4.model.SearchParameter; @@ -21,7 +19,8 @@ import org.mockito.junit.MockitoJUnitRunner; import java.util.Map; import static org.junit.Assert.*; -import static org.mockito.ArgumentMatchers.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) diff --git a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java index 5ff6e90b186..003753eec7a 100644 --- a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java +++ b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java @@ -22,13 +22,13 @@ package ca.uhn.fhir.jpa.subscription.module.cache; import ca.uhn.fhir.jpa.api.IDaoRegistry; import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; import ca.uhn.fhir.jpa.searchparam.retry.Retrier; import ca.uhn.fhir.rest.api.server.IBundleProvider; import ca.uhn.fhir.rest.param.TokenOrListParam; import ca.uhn.fhir.rest.param.TokenParam; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang3.time.DateUtils; import org.hl7.fhir.instance.model.api.IBaseResource; diff --git a/hapi-fhir-jpaserver-subscription/src/test/java/ca/uhn/fhir/jpa/subscription/module/config/TestSubscriptionDstu3Config.java b/hapi-fhir-jpaserver-subscription/src/test/java/ca/uhn/fhir/jpa/subscription/module/config/TestSubscriptionDstu3Config.java index a4238230f12..0a09fe40757 100644 --- a/hapi-fhir-jpaserver-subscription/src/test/java/ca/uhn/fhir/jpa/subscription/module/config/TestSubscriptionDstu3Config.java +++ b/hapi-fhir-jpaserver-subscription/src/test/java/ca/uhn/fhir/jpa/subscription/module/config/TestSubscriptionDstu3Config.java @@ -1,10 +1,13 @@ package ca.uhn.fhir.jpa.subscription.module.config; import ca.uhn.fhir.jpa.api.IDaoRegistry; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; import ca.uhn.fhir.jpa.searchparam.registry.ISearchParamProvider; import ca.uhn.fhir.jpa.subscription.module.cache.ISubscriptionProvider; -import org.springframework.context.annotation.*; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Primary; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; diff --git a/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java b/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java index 93958633bcf..bef3211fafa 100644 --- a/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java +++ b/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java @@ -1,10 +1,10 @@ package ca.uhn.fhirtest.interceptor; -import ca.uhn.fhir.jpa.model.sched.ISchedulerService; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.rest.api.RestOperationTypeEnum; import ca.uhn.fhir.rest.client.apache.ApacheRestfulClientFactory; import ca.uhn.fhir.rest.server.interceptor.InterceptorAdapter; +import ca.uhn.fhir.rest.server.sched.ISchedulerService; +import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails; import ca.uhn.fhir.util.UrlUtil; import org.apache.http.client.HttpClient; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/IHapiScheduler.java b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/IHapiScheduler.java similarity index 79% rename from hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/IHapiScheduler.java rename to hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/IHapiScheduler.java index 2338af8f404..6c40bd0b3fe 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/IHapiScheduler.java +++ b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/IHapiScheduler.java @@ -1,6 +1,5 @@ -package ca.uhn.fhir.jpa.sched; +package ca.uhn.fhir.rest.server.sched; -import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import org.quartz.SchedulerException; public interface IHapiScheduler { diff --git a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerFactory.java b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerFactory.java new file mode 100644 index 00000000000..3e81d250228 --- /dev/null +++ b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerFactory.java @@ -0,0 +1,7 @@ +package ca.uhn.fhir.rest.server.sched; + +public interface ISchedulerFactory { + IHapiScheduler newClusteredHapiScheduler(); + + IHapiScheduler newLocalHapiScheduler(); +} diff --git a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISchedulerService.java b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerService.java similarity index 97% rename from hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISchedulerService.java rename to hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerService.java index a5446cbb67b..d413edb273e 100644 --- a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISchedulerService.java +++ b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerService.java @@ -1,4 +1,4 @@ -package ca.uhn.fhir.jpa.model.sched; +package ca.uhn.fhir.rest.server.sched; /*- * #%L diff --git a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ScheduledJobDefinition.java b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ScheduledJobDefinition.java similarity index 97% rename from hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ScheduledJobDefinition.java rename to hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ScheduledJobDefinition.java index caa28b0ab32..bf3f35510c4 100644 --- a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ScheduledJobDefinition.java +++ b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ScheduledJobDefinition.java @@ -1,4 +1,4 @@ -package ca.uhn.fhir.jpa.model.sched; +package ca.uhn.fhir.rest.server.sched; /*- * #%L From a71eb039e33ff453b9427d7a1f48eb824eaef725 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Thu, 21 Nov 2019 21:19:56 -0500 Subject: [PATCH 05/34] merge two beans into one --- .../main/java/ca/uhn/fhir/jpa/config/BaseConfig.java | 8 +------- .../ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java | 12 +++++++++--- .../uhn/fhir/jpa/sched/SchedulerServiceImplTest.java | 10 +--------- 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java index 7a4a82e228f..baec583a33e 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java @@ -36,7 +36,6 @@ import ca.uhn.fhir.jpa.subscription.module.channel.ISubscribableChannelFactory; import ca.uhn.fhir.jpa.subscription.module.matcher.ISubscriptionMatcher; import ca.uhn.fhir.jpa.subscription.module.matcher.InMemorySubscriptionMatcher; import ca.uhn.fhir.rest.server.interceptor.consent.IConsentContextServices; -import ca.uhn.fhir.rest.server.sched.ISchedulerFactory; import ca.uhn.fhir.rest.server.sched.ISchedulerService; import org.hibernate.jpa.HibernatePersistenceProvider; import org.hl7.fhir.utilities.graphql.IGraphQLStorageServices; @@ -251,12 +250,7 @@ public abstract class BaseConfig { @Bean public ISchedulerService schedulerService() { - return new SchedulerServiceImpl(); - } - - @Bean - public ISchedulerFactory schedulerFactory() { - return new HapiSchedulerFactory(); + return new SchedulerServiceImpl(new HapiSchedulerFactory()); } @Bean diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java index 7a9f00d8362..0b13675c0ef 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java @@ -65,8 +65,8 @@ public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { private boolean myClusteredSchedulingEnabled; private AtomicBoolean myStopping = new AtomicBoolean(false); - @Autowired - private ISchedulerFactory mySchedulerFactory; + + private final ISchedulerFactory mySchedulerFactory; @Autowired private Environment myEnvironment; @Autowired @@ -74,12 +74,18 @@ public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { /** * Constructor + * @param theSchedulerFactory */ - public SchedulerServiceImpl() { + public SchedulerServiceImpl(ISchedulerFactory theSchedulerFactory) { + mySchedulerFactory = theSchedulerFactory; setLocalSchedulingEnabled(true); setClusteredSchedulingEnabled(true); } + public ISchedulerFactory getSchedulerFactory() { + return mySchedulerFactory; + } + public boolean isLocalSchedulingEnabled() { return myLocalSchedulingEnabled; } diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java index 070283913af..3d677800fc1 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java @@ -1,7 +1,6 @@ package ca.uhn.fhir.jpa.sched; import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; -import ca.uhn.fhir.rest.server.sched.ISchedulerFactory; import ca.uhn.fhir.rest.server.sched.ISchedulerService; import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import org.junit.After; @@ -180,21 +179,14 @@ public class SchedulerServiceImplTest { sleepAtLeast(ourTaskDelay); ourCount++; } - } - @Configuration public static class TestConfiguration { @Bean public ISchedulerService schedulerService() { - return new SchedulerServiceImpl(); - } - - @Bean - public ISchedulerFactory schedulerFactory() { - return new HapiSchedulerFactory(); + return new SchedulerServiceImpl(new HapiSchedulerFactory()); } @Bean From 90040f4bddf2d5459f462f629a30b830bd4e1843 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Mon, 25 Nov 2019 16:53:05 -0500 Subject: [PATCH 06/34] remove mismatches tags --- .../ca/uhn/hapi/fhir/docs/contributing/hacking_guide.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/docs/contributing/hacking_guide.md b/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/docs/contributing/hacking_guide.md index 9601ad2352f..945e0764ecb 100644 --- a/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/docs/contributing/hacking_guide.md +++ b/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/docs/contributing/hacking_guide.md @@ -111,6 +111,4 @@ Next, browse to the directory where you checked out the HAPI FHIR sources. You m - - From 4c7c574eefcf21acc91b972369f99f858c609e25 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Mon, 25 Nov 2019 20:12:45 -0500 Subject: [PATCH 07/34] first pass scheduler working --- .../java/ca/uhn/fhir/jpa/config/BaseConfig.java | 7 ++++++- .../ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java | 15 +++++++-------- .../fhir/jpa/sched/ClusteredHapiScheduler.java | 10 ---------- .../ca/uhn/fhir/jpa/sched/LocalHapiScheduler.java | 10 ---------- .../java/ca/uhn/fhir/jpa/sched/NullScheduler.java | 8 -------- .../ca/uhn/fhir/jpa/sched/QuartzTableSeeder.java | 2 +- .../uhn/fhir/jpa/sched/SchedulerServiceImpl.java | 2 ++ 7 files changed, 16 insertions(+), 38 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java index baec583a33e..1c7da21d963 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java @@ -36,6 +36,7 @@ import ca.uhn.fhir.jpa.subscription.module.channel.ISubscribableChannelFactory; import ca.uhn.fhir.jpa.subscription.module.matcher.ISubscriptionMatcher; import ca.uhn.fhir.jpa.subscription.module.matcher.InMemorySubscriptionMatcher; import ca.uhn.fhir.rest.server.interceptor.consent.IConsentContextServices; +import ca.uhn.fhir.rest.server.sched.ISchedulerFactory; import ca.uhn.fhir.rest.server.sched.ISchedulerService; import org.hibernate.jpa.HibernatePersistenceProvider; import org.hl7.fhir.utilities.graphql.IGraphQLStorageServices; @@ -250,7 +251,11 @@ public abstract class BaseConfig { @Bean public ISchedulerService schedulerService() { - return new SchedulerServiceImpl(new HapiSchedulerFactory()); + return new SchedulerServiceImpl(hapiSchedulerFactory()); + } + @Bean + public ISchedulerFactory hapiSchedulerFactory() { + return new HapiSchedulerFactory(); } @Bean diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java index 775d67f366b..aa52534d0d7 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java @@ -56,10 +56,13 @@ public abstract class BaseHapiScheduler implements IHapiScheduler { myScheduler.standby(); } - private void setProperties() { - myProperties.put("org.quartz.threadPool.threadCount", "4"); - myProperties.put("org.quartz.threadPool.threadNamePrefix", myThreadNamePrefix + "-" + myProperties.get(PROP_SCHED_INSTANCE_NAME)); - addProperties(myProperties); + protected void setProperties() { + addProperty("org.quartz.threadPool.threadCount", "4"); + addProperty("org.quartz.threadPool.threadNamePrefix", myThreadNamePrefix + "-" + myProperties.get(PROP_SCHED_INSTANCE_NAME)); + } + + protected void addProperty(String key, String value) { + myProperties.put(key, value); } @Override @@ -155,8 +158,4 @@ public abstract class BaseHapiScheduler implements IHapiScheduler { return true; } } - - abstract void addProperties(Properties theProperties); -// FIXME KHS -// quartzPropertiesClustered(clusteredProperties); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/ClusteredHapiScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/ClusteredHapiScheduler.java index 4e02813c2bc..d09e7617ca3 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/ClusteredHapiScheduler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/ClusteredHapiScheduler.java @@ -1,18 +1,8 @@ package ca.uhn.fhir.jpa.sched; -import java.util.Properties; - public class ClusteredHapiScheduler extends BaseHapiScheduler { public ClusteredHapiScheduler(String theThreadNamePrefix, AutowiringSpringBeanJobFactory theSpringBeanJobFactory) { super(theThreadNamePrefix, theSpringBeanJobFactory); setInstanceName("clustered"); } - - /** - * Properties for the cluster scheduler (see the class docs to learn what this means) - */ - @Override - void addProperties(Properties theProperties) { -// theProperties.put("org.quartz.jobStore.tablePrefix", "QRTZHFJC_"); - } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/LocalHapiScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/LocalHapiScheduler.java index 84b25de2282..7c7067cf509 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/LocalHapiScheduler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/LocalHapiScheduler.java @@ -1,18 +1,8 @@ package ca.uhn.fhir.jpa.sched; -import java.util.Properties; - public class LocalHapiScheduler extends BaseHapiScheduler { public LocalHapiScheduler(String theThreadNamePrefix, AutowiringSpringBeanJobFactory theSpringBeanJobFactory) { super(theThreadNamePrefix, theSpringBeanJobFactory); setInstanceName("local"); } - - /** - * Properties for the local scheduler (see the class docs to learn what this means) - */ - @Override - void addProperties(Properties theProperties) { - // nothing - } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java index 5c059e846c1..b83d74f2052 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java @@ -1,15 +1,7 @@ package ca.uhn.fhir.jpa.sched; -import java.util.Properties; - class NullScheduler extends BaseHapiScheduler { - public NullScheduler(String theThreadNamePrefix, AutowiringSpringBeanJobFactory theSpringBeanJobFactory) { super(theThreadNamePrefix, theSpringBeanJobFactory); } - - @Override - void addProperties(Properties theProperties) { - //nothing - } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/QuartzTableSeeder.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/QuartzTableSeeder.java index 49ee1dec51f..b780bccd88e 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/QuartzTableSeeder.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/QuartzTableSeeder.java @@ -32,7 +32,7 @@ public class QuartzTableSeeder { @PostConstruct public void start() { - +// FIXME KHS what is this? } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java index 0b13675c0ef..e1c4b006b50 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java @@ -115,8 +115,10 @@ public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { } IHapiScheduler retval; if (theClustered) { + ourLog.info("Creating Clustered Scheduler"); retval = mySchedulerFactory.newClusteredHapiScheduler(); } else { + ourLog.info("Creating Local Scheduler"); retval = mySchedulerFactory.newLocalHapiScheduler(); } retval.init(); From a89bb6c41124c99d168322c0527b4840f98db496 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Mon, 25 Nov 2019 20:59:40 -0500 Subject: [PATCH 08/34] simplified api --- .../ca/uhn/fhir/jpa/config/BaseConfig.java | 10 ++----- ...mpl.java => BaseSchedulerServiceImpl.java} | 28 ++++++++----------- .../fhir/jpa/sched/HapiSchedulerFactory.java | 20 ------------- .../jpa/sched/HapiSchedulerServiceImpl.java | 17 +++++++++++ .../jpa/sched/SchedulerServiceImplTest.java | 4 +-- .../rest/server/sched/ISchedulerFactory.java | 7 ----- 6 files changed, 32 insertions(+), 54 deletions(-) rename hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/{SchedulerServiceImpl.java => BaseSchedulerServiceImpl.java} (89%) delete mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiSchedulerFactory.java create mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiSchedulerServiceImpl.java delete mode 100644 hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerFactory.java diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java index 1c7da21d963..61018d64fca 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java @@ -15,8 +15,7 @@ import ca.uhn.fhir.jpa.interceptor.JpaConsentContextServices; import ca.uhn.fhir.jpa.provider.SubscriptionTriggeringProvider; import ca.uhn.fhir.jpa.provider.TerminologyUploaderProvider; import ca.uhn.fhir.jpa.sched.AutowiringSpringBeanJobFactory; -import ca.uhn.fhir.jpa.sched.HapiSchedulerFactory; -import ca.uhn.fhir.jpa.sched.SchedulerServiceImpl; +import ca.uhn.fhir.jpa.sched.HapiSchedulerServiceImpl; import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider; import ca.uhn.fhir.jpa.search.IStaleSearchDeletingSvc; import ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl; @@ -36,7 +35,6 @@ import ca.uhn.fhir.jpa.subscription.module.channel.ISubscribableChannelFactory; import ca.uhn.fhir.jpa.subscription.module.matcher.ISubscriptionMatcher; import ca.uhn.fhir.jpa.subscription.module.matcher.InMemorySubscriptionMatcher; import ca.uhn.fhir.rest.server.interceptor.consent.IConsentContextServices; -import ca.uhn.fhir.rest.server.sched.ISchedulerFactory; import ca.uhn.fhir.rest.server.sched.ISchedulerService; import org.hibernate.jpa.HibernatePersistenceProvider; import org.hl7.fhir.utilities.graphql.IGraphQLStorageServices; @@ -251,11 +249,7 @@ public abstract class BaseConfig { @Bean public ISchedulerService schedulerService() { - return new SchedulerServiceImpl(hapiSchedulerFactory()); - } - @Bean - public ISchedulerFactory hapiSchedulerFactory() { - return new HapiSchedulerFactory(); + return new HapiSchedulerServiceImpl(); } @Bean diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java similarity index 89% rename from hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java rename to hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java index e1c4b006b50..67d03b15c74 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java @@ -23,7 +23,6 @@ package ca.uhn.fhir.jpa.sched; import ca.uhn.fhir.context.ConfigurationException; import ca.uhn.fhir.model.api.ISmartLifecyclePhase; import ca.uhn.fhir.rest.server.sched.IHapiScheduler; -import ca.uhn.fhir.rest.server.sched.ISchedulerFactory; import ca.uhn.fhir.rest.server.sched.ISchedulerService; import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import org.quartz.SchedulerException; @@ -54,38 +53,29 @@ import java.util.concurrent.atomic.AtomicBoolean; * * */ -public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { +public abstract class BaseSchedulerServiceImpl implements ISchedulerService, SmartLifecycle { public static final String SCHEDULING_DISABLED = "scheduling_disabled"; public static final String SCHEDULING_DISABLED_EQUALS_TRUE = SCHEDULING_DISABLED + "=true"; - private static final Logger ourLog = LoggerFactory.getLogger(SchedulerServiceImpl.class); + private static final Logger ourLog = LoggerFactory.getLogger(BaseSchedulerServiceImpl.class); private IHapiScheduler myLocalScheduler; private IHapiScheduler myClusteredScheduler; private boolean myLocalSchedulingEnabled; private boolean myClusteredSchedulingEnabled; private AtomicBoolean myStopping = new AtomicBoolean(false); - - private final ISchedulerFactory mySchedulerFactory; @Autowired private Environment myEnvironment; @Autowired private ApplicationContext myApplicationContext; + @Autowired + protected AutowiringSpringBeanJobFactory mySchedulerJobFactory; - /** - * Constructor - * @param theSchedulerFactory - */ - public SchedulerServiceImpl(ISchedulerFactory theSchedulerFactory) { - mySchedulerFactory = theSchedulerFactory; + public BaseSchedulerServiceImpl() { setLocalSchedulingEnabled(true); setClusteredSchedulingEnabled(true); } - public ISchedulerFactory getSchedulerFactory() { - return mySchedulerFactory; - } - public boolean isLocalSchedulingEnabled() { return myLocalSchedulingEnabled; } @@ -116,15 +106,19 @@ public class SchedulerServiceImpl implements ISchedulerService, SmartLifecycle { IHapiScheduler retval; if (theClustered) { ourLog.info("Creating Clustered Scheduler"); - retval = mySchedulerFactory.newClusteredHapiScheduler(); + retval = getClusteredScheduler(); } else { ourLog.info("Creating Local Scheduler"); - retval = mySchedulerFactory.newLocalHapiScheduler(); + retval = getLocalHapiScheduler(); } retval.init(); return retval; } + protected abstract IHapiScheduler getLocalHapiScheduler(); + + protected abstract IHapiScheduler getClusteredScheduler(); + /** * We defer startup of executing started tasks until we're sure we're ready for it * and the startup is completely done diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiSchedulerFactory.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiSchedulerFactory.java deleted file mode 100644 index 213fa342c24..00000000000 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiSchedulerFactory.java +++ /dev/null @@ -1,20 +0,0 @@ -package ca.uhn.fhir.jpa.sched; - -import ca.uhn.fhir.rest.server.sched.IHapiScheduler; -import ca.uhn.fhir.rest.server.sched.ISchedulerFactory; -import org.springframework.beans.factory.annotation.Autowired; - -public class HapiSchedulerFactory implements ISchedulerFactory { - public static final String THREAD_NAME_PREFIX = "hapi-fhir-jpa-scheduler"; - - @Autowired - private AutowiringSpringBeanJobFactory mySpringBeanJobFactory; - - public IHapiScheduler newClusteredHapiScheduler() { - return new ClusteredHapiScheduler(THREAD_NAME_PREFIX, mySpringBeanJobFactory); - } - - public IHapiScheduler newLocalHapiScheduler() { - return new LocalHapiScheduler(THREAD_NAME_PREFIX, mySpringBeanJobFactory); - } -} diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiSchedulerServiceImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiSchedulerServiceImpl.java new file mode 100644 index 00000000000..a0e8530c06e --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiSchedulerServiceImpl.java @@ -0,0 +1,17 @@ +package ca.uhn.fhir.jpa.sched; + +import ca.uhn.fhir.rest.server.sched.IHapiScheduler; + +public class HapiSchedulerServiceImpl extends BaseSchedulerServiceImpl { + public static final String THREAD_NAME_PREFIX = "hapi-fhir-jpa-scheduler"; + + @Override + protected IHapiScheduler getLocalHapiScheduler() { + return new LocalHapiScheduler(THREAD_NAME_PREFIX, mySchedulerJobFactory); + } + + @Override + protected IHapiScheduler getClusteredScheduler() { + return new ClusteredHapiScheduler(THREAD_NAME_PREFIX, mySchedulerJobFactory); + } +} diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java index 3d677800fc1..016751be8d8 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java @@ -65,7 +65,7 @@ public class SchedulerServiceImplTest { .setId(CountingJob.class.getName()) .setJobClass(CountingJob.class); - SchedulerServiceImpl svc = AopTestUtils.getTargetObject(mySvc); + BaseSchedulerServiceImpl svc = AopTestUtils.getTargetObject(mySvc); svc.stop(); svc.create(); svc.start(); @@ -186,7 +186,7 @@ public class SchedulerServiceImplTest { @Bean public ISchedulerService schedulerService() { - return new SchedulerServiceImpl(new HapiSchedulerFactory()); + return new HapiSchedulerServiceImpl(); } @Bean diff --git a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerFactory.java b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerFactory.java deleted file mode 100644 index 3e81d250228..00000000000 --- a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerFactory.java +++ /dev/null @@ -1,7 +0,0 @@ -package ca.uhn.fhir.rest.server.sched; - -public interface ISchedulerFactory { - IHapiScheduler newClusteredHapiScheduler(); - - IHapiScheduler newLocalHapiScheduler(); -} From 9693b1736ed0b501ffbb0de694b445f5e0ee6338 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Wed, 27 Nov 2019 17:10:27 -0500 Subject: [PATCH 09/34] fixed quartz sql with a hack. need a better fix. --- .../tasks/SchemaInitializationProvider.java | 38 ++++++++++++++++--- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java index 633a26f41e3..ff0e6880b42 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java @@ -27,18 +27,20 @@ import com.google.common.base.Charsets; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.builder.HashCodeBuilder; +import javax.annotation.Nonnull; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import static org.apache.commons.lang3.StringUtils.isBlank; + public class SchemaInitializationProvider implements ISchemaInitializationProvider { private final String mySchemaFileClassPath; private final String mySchemaExistsIndicatorTable; /** - * - * @param theSchemaFileClassPath pathname to script used to initialize schema + * @param theSchemaFileClassPath pathname to script used to initialize schema * @param theSchemaExistsIndicatorTable a table name we can use to determine if this schema has already been initialized */ public SchemaInitializationProvider(String theSchemaFileClassPath, String theSchemaExistsIndicatorTable) { @@ -50,8 +52,7 @@ public class SchemaInitializationProvider implements ISchemaInitializationProvid public List getSqlStatements(DriverTypeEnum theDriverType) { List retval = new ArrayList<>(); - String initScript; - initScript = mySchemaFileClassPath + "/" + theDriverType.getSchemaFilename(); + String initScript = mySchemaFileClassPath + "/" + getInitScript(theDriverType); try { InputStream sqlFileInputStream = SchemaInitializationProvider.class.getResourceAsStream(initScript); if (sqlFileInputStream == null) { @@ -60,8 +61,9 @@ public class SchemaInitializationProvider implements ISchemaInitializationProvid // Assumes no escaped semicolons... String[] statements = IOUtils.toString(sqlFileInputStream, Charsets.UTF_8).split("\\;"); for (String statement : statements) { - if (!statement.trim().isEmpty()) { - retval.add(statement); + String cleanedStatement = clean(statement); + if (!isBlank(cleanedStatement)) { + retval.add(cleanedStatement + ";"); } } } catch (IOException e) { @@ -70,6 +72,29 @@ public class SchemaInitializationProvider implements ISchemaInitializationProvid return retval; } + private String clean(String theStatement) { + String[] lines = theStatement.split("\\n"); + String retval = ""; + for (String fullLine : lines) { + String line = fullLine.trim(); + if (isBlank(line) || + line.startsWith("--")) { + continue; + } + // FIXME KHS hack to fix bug in Quartz SQL + if ("BOOL_PROP_2 BOOLEAN NULL,".equals(line)) { + line = "BOOL_PROP_2 BOOLEAN NULL"; + } + retval += line + "\n"; + } + return retval; + } + + @Nonnull + protected String getInitScript(DriverTypeEnum theDriverType) { + return theDriverType.getSchemaFilename(); + } + @Override public boolean equals(Object theO) { if (this == theO) return true; @@ -93,3 +118,4 @@ public class SchemaInitializationProvider implements ISchemaInitializationProvid return mySchemaExistsIndicatorTable; } } + From bf003f0d166ad7554188ffa72f9cbd77dd615a1e Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Wed, 27 Nov 2019 21:54:13 -0500 Subject: [PATCH 10/34] cleaned up cleanup --- .../tasks/SchemaInitializationProvider.java | 24 +++++++------------ .../SchemaInitializationProviderTest.java | 14 +++++++++++ 2 files changed, 22 insertions(+), 16 deletions(-) create mode 100644 hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java index ff0e6880b42..0d661cb74ee 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java @@ -32,10 +32,13 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import static org.apache.commons.lang3.StringUtils.isBlank; public class SchemaInitializationProvider implements ISchemaInitializationProvider { + private static final Pattern ourTrailingCommaPattern = Pattern.compile(",(\\s+)\\)"); private final String mySchemaFileClassPath; private final String mySchemaExistsIndicatorTable; @@ -72,22 +75,11 @@ public class SchemaInitializationProvider implements ISchemaInitializationProvid return retval; } - private String clean(String theStatement) { - String[] lines = theStatement.split("\\n"); - String retval = ""; - for (String fullLine : lines) { - String line = fullLine.trim(); - if (isBlank(line) || - line.startsWith("--")) { - continue; - } - // FIXME KHS hack to fix bug in Quartz SQL - if ("BOOL_PROP_2 BOOLEAN NULL,".equals(line)) { - line = "BOOL_PROP_2 BOOLEAN NULL"; - } - retval += line + "\n"; - } - return retval; + static String clean(String theStatement) { + // Remove commas before brackets. Some databases don't like this and + // some schemas shipped with Quartz include them + Matcher matcher = ourTrailingCommaPattern.matcher(theStatement); + return matcher.replaceAll("$1\\)"); } @Nonnull diff --git a/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java b/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java new file mode 100644 index 00000000000..3913e61ddc3 --- /dev/null +++ b/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java @@ -0,0 +1,14 @@ +package ca.uhn.fhir.jpa.migrate.tasks; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class SchemaInitializationProviderTest { + @Test + public void testClean() { + assertEquals("foo\n)", SchemaInitializationProvider.clean("foo,\n)")); + assertEquals("foo\n )", SchemaInitializationProvider.clean("foo,\n )")); + assertEquals("foo,bar\n )", SchemaInitializationProvider.clean("foo,bar\n )")); + } +} From a58da3b53538f86f19ce1a25ce25bccc2aac5c37 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Thu, 28 Nov 2019 12:10:34 -0500 Subject: [PATCH 11/34] name schema initializer to distinguish between different schemas --- .../migrate/taskdef/InitializeSchemaTask.java | 2 +- .../migrate/tasks/HapiFhirJpaMigrationTasks.java | 2 +- .../tasks/SchemaInitializationProvider.java | 16 ++++++++++++---- .../tasks/api/ISchemaInitializationProvider.java | 2 ++ .../taskdef/InitializeSchemaTaskTest.java | 5 +++++ 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTask.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTask.java index 7365bd37a8d..4ab392d1c6a 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTask.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTask.java @@ -39,7 +39,7 @@ public class InitializeSchemaTask extends BaseTask { public InitializeSchemaTask(String theProductVersion, String theSchemaVersion, ISchemaInitializationProvider theSchemaInitializationProvider) { super(theProductVersion, theSchemaVersion); mySchemaInitializationProvider = theSchemaInitializationProvider; - setDescription("Initialize schema"); + setDescription("Initialize schema for " + theSchemaInitializationProvider.getDescription()); } @Override diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java index 0c1190f5e50..117c05a9e88 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java @@ -875,7 +875,7 @@ public class HapiFhirJpaMigrationTasks extends BaseMigrationTasks { private void init330() { // 20180114 - 20180329 Builder version = forVersion(VersionEnum.V3_3_0); - version.initializeSchema("20180115.0", new SchemaInitializationProvider("/ca/uhn/hapi/fhir/jpa/docs/database", "HFJ_RESOURCE")); + version.initializeSchema("20180115.0", new SchemaInitializationProvider("HAPI-FHIR", "/ca/uhn/hapi/fhir/jpa/docs/database", "HFJ_RESOURCE")); Builder.BuilderWithTableName hfjResource = version.onTable("HFJ_RESOURCE"); version.startSectionWithMessage("Starting work on table: " + hfjResource.getTableName()); diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java index 0d661cb74ee..ae5bd36f785 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java @@ -38,15 +38,17 @@ import java.util.regex.Pattern; import static org.apache.commons.lang3.StringUtils.isBlank; public class SchemaInitializationProvider implements ISchemaInitializationProvider { - private static final Pattern ourTrailingCommaPattern = Pattern.compile(",(\\s+)\\)"); + private final String mySchemaDescription; private final String mySchemaFileClassPath; private final String mySchemaExistsIndicatorTable; /** + * @param theSchemaDescription description of the schema being updated (for logging) * @param theSchemaFileClassPath pathname to script used to initialize schema * @param theSchemaExistsIndicatorTable a table name we can use to determine if this schema has already been initialized */ - public SchemaInitializationProvider(String theSchemaFileClassPath, String theSchemaExistsIndicatorTable) { + public SchemaInitializationProvider(String theSchemaDescription, String theSchemaFileClassPath, String theSchemaExistsIndicatorTable) { + mySchemaDescription = theSchemaDescription; mySchemaFileClassPath = theSchemaFileClassPath; mySchemaExistsIndicatorTable = theSchemaExistsIndicatorTable; } @@ -75,13 +77,19 @@ public class SchemaInitializationProvider implements ISchemaInitializationProvid return retval; } + private static final Pattern ourTrailingCommaPattern = Pattern.compile(",(\\s+)\\)"); + static String clean(String theStatement) { - // Remove commas before brackets. Some databases don't like this and - // some schemas shipped with Quartz include them + // Remove commas before brackets. The Quartz h2 schema has a comma before a closing bracket that fails to execute... Matcher matcher = ourTrailingCommaPattern.matcher(theStatement); return matcher.replaceAll("$1\\)"); } + @Override + public String getDescription() { + return mySchemaDescription; + } + @Nonnull protected String getInitScript(DriverTypeEnum theDriverType) { return theDriverType.getSchemaFilename(); diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/ISchemaInitializationProvider.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/ISchemaInitializationProvider.java index 1dd3a8370cf..edb855a5bfd 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/ISchemaInitializationProvider.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/ISchemaInitializationProvider.java @@ -28,4 +28,6 @@ public interface ISchemaInitializationProvider { List getSqlStatements(DriverTypeEnum theDriverType); String getSchemaExistsIndicatorTable(); + + String getDescription(); } diff --git a/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTaskTest.java b/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTaskTest.java index a55cd045f9d..9d96ea4aaa8 100644 --- a/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTaskTest.java +++ b/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTaskTest.java @@ -40,6 +40,11 @@ public class InitializeSchemaTaskTest extends BaseTest { return "DONT_MATCH_ME"; } + @Override + public String getDescription() { + return "test"; + } + @Override public boolean equals(Object theO) { if (this == theO) return true; From f450cea9a53c8a4528c57df743b268d421c2540a Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Thu, 28 Nov 2019 17:57:52 -0500 Subject: [PATCH 12/34] disable gap time for now --- .../ca/uhn/fhir/jpa/model/sched/FireAtIntervalJob.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/FireAtIntervalJob.java b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/FireAtIntervalJob.java index 52e787c54c6..fe2a89a70f1 100644 --- a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/FireAtIntervalJob.java +++ b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/FireAtIntervalJob.java @@ -41,23 +41,28 @@ public abstract class FireAtIntervalJob implements Job { @Override public final void execute(JobExecutionContext theContext) { + /** FIXME KHS Long nextExecution = (Long) theContext.getJobDetail().getJobDataMap().get(NEXT_EXECUTION_TIME); if (nextExecution != null) { long cutoff = System.currentTimeMillis(); if (nextExecution >= cutoff) { + ourLog.info("Not enough time has passed since last execution of {}. Skipping this one.", theContext.getJobDetail().getDescription()); return; } } - +*/ try { doExecute(theContext); } catch (Throwable t) { ourLog.error("Job threw uncaught exception", t); - } finally { + } + /** FIXME KHS + finally { long newNextExecution = System.currentTimeMillis() + myMillisBetweenExecutions; theContext.getJobDetail().getJobDataMap().put(NEXT_EXECUTION_TIME, newNextExecution); } + */ } protected abstract void doExecute(JobExecutionContext theContext); From a0e363171d4ab2a2cda15f0ce04838c4376b1ebd Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Fri, 29 Nov 2019 09:21:20 -0500 Subject: [PATCH 13/34] replace FireAtInterval class with an interface for now --- .../fhir/jpa/bulk/BulkDataExportSvcImpl.java | 14 +--- .../jpa/search/warm/CacheWarmingSvcImpl.java | 14 +--- .../SubscriptionTriggeringSvcImpl.java | 14 +--- .../jpa/term/TermDeferredStorageSvcImpl.java | 14 +--- .../fhir/jpa/term/TermReindexingSvcImpl.java | 14 +--- .../jpa/sched/SchedulerServiceImplTest.java | 18 ++--- .../jpa/model/sched/FireAtIntervalJob.java | 70 ------------------- .../ca/uhn/fhir/jpa/model/sched/HapiJob.java | 30 ++++++++ .../model/sched/FireAtIntervalJobTest.java | 40 ----------- .../module/cache/SubscriptionLoader.java | 14 +--- 10 files changed, 55 insertions(+), 187 deletions(-) delete mode 100644 hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/FireAtIntervalJob.java create mode 100644 hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java delete mode 100644 hapi-fhir-jpaserver-model/src/test/java/ca/uhn/fhir/jpa/model/sched/FireAtIntervalJobTest.java diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java index e52f2648cc0..ae6c71ed9b3 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java @@ -32,7 +32,7 @@ import ca.uhn.fhir.jpa.entity.BulkExportCollectionEntity; import ca.uhn.fhir.jpa.entity.BulkExportCollectionFileEntity; import ca.uhn.fhir.jpa.entity.BulkExportJobEntity; import ca.uhn.fhir.jpa.model.cross.ResourcePersistentId; -import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; +import ca.uhn.fhir.jpa.model.sched.HapiJob; import ca.uhn.fhir.jpa.model.search.SearchRuntimeDetails; import ca.uhn.fhir.jpa.model.util.JpaConstants; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; @@ -53,9 +53,7 @@ import org.hl7.fhir.instance.model.api.IBaseBinary; import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.r4.model.InstantType; -import org.quartz.DisallowConcurrentExecution; import org.quartz.JobExecutionContext; -import org.quartz.PersistJobDataAfterExecution; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -469,18 +467,12 @@ public class BulkDataExportSvcImpl implements IBulkDataExportSvc { }); } - @DisallowConcurrentExecution - @PersistJobDataAfterExecution - public static class SubmitJob extends FireAtIntervalJob { + public static class SubmitJob implements HapiJob { @Autowired private IBulkDataExportSvc myTarget; - public SubmitJob() { - super(REFRESH_INTERVAL); - } - @Override - protected void doExecute(JobExecutionContext theContext) { + public void execute(JobExecutionContext theContext) { myTarget.buildExportFiles(); } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java index 32a81557698..18a73dd8090 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java @@ -26,16 +26,14 @@ import ca.uhn.fhir.context.RuntimeResourceDefinition; import ca.uhn.fhir.jpa.dao.DaoConfig; import ca.uhn.fhir.jpa.dao.DaoRegistry; import ca.uhn.fhir.jpa.dao.IFhirResourceDao; -import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; +import ca.uhn.fhir.jpa.model.sched.HapiJob; import ca.uhn.fhir.jpa.searchparam.MatchUrlService; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; import ca.uhn.fhir.rest.server.sched.ISchedulerService; import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.UrlUtil; import org.apache.commons.lang3.time.DateUtils; -import org.quartz.DisallowConcurrentExecution; import org.quartz.JobExecutionContext; -import org.quartz.PersistJobDataAfterExecution; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -132,18 +130,12 @@ public class CacheWarmingSvcImpl implements ICacheWarmingSvc { } - @DisallowConcurrentExecution - @PersistJobDataAfterExecution - public static class SubmitJob extends FireAtIntervalJob { + public static class SubmitJob implements HapiJob { @Autowired private ICacheWarmingSvc myTarget; - public SubmitJob() { - super(SCHEDULED_JOB_INTERVAL); - } - @Override - protected void doExecute(JobExecutionContext theContext) { + public void execute(JobExecutionContext theContext) { myTarget.performWarmingPass(); } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java index 33014515c8a..10743b1eb5b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java @@ -26,7 +26,7 @@ import ca.uhn.fhir.jpa.dao.DaoConfig; import ca.uhn.fhir.jpa.dao.DaoRegistry; import ca.uhn.fhir.jpa.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.model.cross.ResourcePersistentId; -import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; +import ca.uhn.fhir.jpa.model.sched.HapiJob; import ca.uhn.fhir.jpa.provider.SubscriptionTriggeringProvider; import ca.uhn.fhir.jpa.search.ISearchCoordinatorSvc; import ca.uhn.fhir.jpa.searchparam.MatchUrlService; @@ -55,9 +55,7 @@ import org.hl7.fhir.instance.model.api.IBaseParameters; import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.instance.model.api.IPrimitiveType; -import org.quartz.DisallowConcurrentExecution; import org.quartz.JobExecutionContext; -import org.quartz.PersistJobDataAfterExecution; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -389,18 +387,12 @@ public class SubscriptionTriggeringSvcImpl implements ISubscriptionTriggeringSvc } - @DisallowConcurrentExecution - @PersistJobDataAfterExecution - public static class SubmitJob extends FireAtIntervalJob { + public static class SubmitJob implements HapiJob { @Autowired private ISubscriptionTriggeringSvc myTarget; - public SubmitJob() { - super(SCHEDULE_DELAY); - } - @Override - protected void doExecute(JobExecutionContext theContext) { + public void execute(JobExecutionContext theContext) { myTarget.runDeliveryPass(); } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java index e7fdbe4b142..1092c418b6a 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java @@ -25,7 +25,7 @@ import ca.uhn.fhir.jpa.dao.data.ITermConceptDao; import ca.uhn.fhir.jpa.dao.data.ITermConceptParentChildLinkDao; import ca.uhn.fhir.jpa.entity.TermConcept; import ca.uhn.fhir.jpa.entity.TermConceptParentChildLink; -import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; +import ca.uhn.fhir.jpa.model.sched.HapiJob; import ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermDeferredStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermVersionAdapterSvc; @@ -289,20 +289,12 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { myConceptDao = theConceptDao; } - public static class SaveDeferredJob extends FireAtIntervalJob { - + public static class SaveDeferredJob implements HapiJob { @Autowired private ITermDeferredStorageSvc myTerminologySvc; - /** - * Constructor - */ - public SaveDeferredJob() { - super(SCHEDULE_INTERVAL_MILLIS); - } - @Override - protected void doExecute(JobExecutionContext theContext) { + public void execute(JobExecutionContext theContext) { myTerminologySvc.saveDeferred(); } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java index 4b51e11b471..b206fcbc1a0 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java @@ -23,7 +23,7 @@ package ca.uhn.fhir.jpa.term; import ca.uhn.fhir.jpa.dao.data.ITermConceptDao; import ca.uhn.fhir.jpa.dao.data.ITermConceptParentChildLinkDao; import ca.uhn.fhir.jpa.entity.TermConcept; -import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; +import ca.uhn.fhir.jpa.model.sched.HapiJob; import ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermDeferredStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermReindexingSvc; @@ -159,20 +159,12 @@ public class TermReindexingSvcImpl implements ITermReindexingSvc { mySchedulerService.scheduleFixedDelayLocal(SCHEDULE_INTERVAL_MILLIS, jobDefinition); } - public static class SaveDeferredJob extends FireAtIntervalJob { - + public static class SaveDeferredJob implements HapiJob { @Autowired private ITermDeferredStorageSvc myTerminologySvc; - /** - * Constructor - */ - public SaveDeferredJob() { - super(SCHEDULE_INTERVAL_MILLIS); - } - @Override - protected void doExecute(JobExecutionContext theContext) { + public void execute(JobExecutionContext theContext) { myTerminologySvc.saveDeferred(); } } diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java index 016751be8d8..b290725cc56 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java @@ -1,13 +1,16 @@ package ca.uhn.fhir.jpa.sched; -import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; +import ca.uhn.fhir.jpa.model.sched.HapiJob; import ca.uhn.fhir.rest.server.sched.ISchedulerService; import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.quartz.*; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.SchedulerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; @@ -157,10 +160,7 @@ public class SchedulerServiceImplTest { } } - - @DisallowConcurrentExecution - @PersistJobDataAfterExecution - public static class CountingIntervalJob extends FireAtIntervalJob { + public static class CountingIntervalJob implements HapiJob { private static int ourCount; @@ -169,12 +169,8 @@ public class SchedulerServiceImplTest { private String myStringBean; private ApplicationContext myAppCtx; - public CountingIntervalJob() { - super(500); - } - @Override - public void doExecute(JobExecutionContext theContext) { + public void execute(JobExecutionContext theContext) { ourLog.info("Job has fired, going to sleep for {}ms", ourTaskDelay); sleepAtLeast(ourTaskDelay); ourCount++; diff --git a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/FireAtIntervalJob.java b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/FireAtIntervalJob.java deleted file mode 100644 index fe2a89a70f1..00000000000 --- a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/FireAtIntervalJob.java +++ /dev/null @@ -1,70 +0,0 @@ -package ca.uhn.fhir.jpa.model.sched; - -/*- - * #%L - * HAPI FHIR Model - * %% - * Copyright (C) 2014 - 2019 University Health Network - * %% - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * #L% - */ - -import org.quartz.DisallowConcurrentExecution; -import org.quartz.Job; -import org.quartz.JobExecutionContext; -import org.quartz.PersistJobDataAfterExecution; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@DisallowConcurrentExecution -@PersistJobDataAfterExecution -public abstract class FireAtIntervalJob implements Job { - - public static final String NEXT_EXECUTION_TIME = "NEXT_EXECUTION_TIME"; - private static final Logger ourLog = LoggerFactory.getLogger(FireAtIntervalJob.class); - private final long myMillisBetweenExecutions; - - public FireAtIntervalJob(long theMillisBetweenExecutions) { - myMillisBetweenExecutions = theMillisBetweenExecutions; - } - - @Override - public final void execute(JobExecutionContext theContext) { - /** FIXME KHS - Long nextExecution = (Long) theContext.getJobDetail().getJobDataMap().get(NEXT_EXECUTION_TIME); - - if (nextExecution != null) { - long cutoff = System.currentTimeMillis(); - if (nextExecution >= cutoff) { - ourLog.info("Not enough time has passed since last execution of {}. Skipping this one.", theContext.getJobDetail().getDescription()); - return; - } - } -*/ - try { - doExecute(theContext); - } catch (Throwable t) { - ourLog.error("Job threw uncaught exception", t); - } - /** FIXME KHS - finally { - long newNextExecution = System.currentTimeMillis() + myMillisBetweenExecutions; - theContext.getJobDetail().getJobDataMap().put(NEXT_EXECUTION_TIME, newNextExecution); - } - */ - } - - protected abstract void doExecute(JobExecutionContext theContext); - -} diff --git a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java new file mode 100644 index 00000000000..6cf22a2a5c1 --- /dev/null +++ b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java @@ -0,0 +1,30 @@ +package ca.uhn.fhir.jpa.model.sched; + +/*- + * #%L + * HAPI FHIR Model + * %% + * Copyright (C) 2014 - 2019 University Health Network + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.PersistJobDataAfterExecution; + +@DisallowConcurrentExecution +@PersistJobDataAfterExecution +public interface HapiJob extends Job { +} diff --git a/hapi-fhir-jpaserver-model/src/test/java/ca/uhn/fhir/jpa/model/sched/FireAtIntervalJobTest.java b/hapi-fhir-jpaserver-model/src/test/java/ca/uhn/fhir/jpa/model/sched/FireAtIntervalJobTest.java deleted file mode 100644 index 6fe7e79c27e..00000000000 --- a/hapi-fhir-jpaserver-model/src/test/java/ca/uhn/fhir/jpa/model/sched/FireAtIntervalJobTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package ca.uhn.fhir.jpa.model.sched; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Answers; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; -import org.quartz.JobExecutionContext; - -import static ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob.NEXT_EXECUTION_TIME; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -@RunWith(MockitoJUnitRunner.class) -public class FireAtIntervalJobTest { - - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private JobExecutionContext myJobExecutionContext; - - @Test - public void testExecutionThrowsException() { - - FireAtIntervalJob job = new FireAtIntervalJob(1000) { - @Override - protected void doExecute(JobExecutionContext theContext) { - throw new NullPointerException(); - } - }; - - // No exception thrown please - job.execute(myJobExecutionContext); - - verify(myJobExecutionContext.getJobDetail().getJobDataMap(), times(1)).put(eq(NEXT_EXECUTION_TIME), anyLong()); - - } - - -} diff --git a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java index 003753eec7a..d49c490dc16 100644 --- a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java +++ b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java @@ -21,7 +21,7 @@ package ca.uhn.fhir.jpa.subscription.module.cache; */ import ca.uhn.fhir.jpa.api.IDaoRegistry; -import ca.uhn.fhir.jpa.model.sched.FireAtIntervalJob; +import ca.uhn.fhir.jpa.model.sched.HapiJob; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; import ca.uhn.fhir.jpa.searchparam.retry.Retrier; import ca.uhn.fhir.rest.api.server.IBundleProvider; @@ -33,9 +33,7 @@ import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang3.time.DateUtils; import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.r4.model.Subscription; -import org.quartz.DisallowConcurrentExecution; import org.quartz.JobExecutionContext; -import org.quartz.PersistJobDataAfterExecution; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -160,18 +158,12 @@ public class SubscriptionLoader { mySubscriptionProvider = theSubscriptionProvider; } - @DisallowConcurrentExecution - @PersistJobDataAfterExecution - public static class SubmitJob extends FireAtIntervalJob { + public static class SubmitJob implements HapiJob { @Autowired private SubscriptionLoader myTarget; - public SubmitJob() { - super(REFRESH_INTERVAL); - } - @Override - protected void doExecute(JobExecutionContext theContext) { + public void execute(JobExecutionContext theContext) { myTarget.syncSubscriptions(); } } From 321790f6bf3250efcb3cef50799fdb353bb1cdb2 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Fri, 29 Nov 2019 10:12:13 -0500 Subject: [PATCH 14/34] standardized job names and how they're scheduled --- .../fhir/jpa/bulk/BulkDataExportSvcImpl.java | 32 +++++++-------- .../jpa/search/warm/CacheWarmingSvcImpl.java | 39 +++++++++---------- .../SubscriptionTriggeringSvcImpl.java | 25 ++++++------ .../jpa/term/TermDeferredStorageSvcImpl.java | 32 +++++++-------- .../fhir/jpa/term/TermReindexingSvcImpl.java | 13 ++++--- .../ca/uhn/fhir/jpa/model/sched/HapiJob.java | 4 +- .../module/cache/SubscriptionLoader.java | 30 +++++++------- 7 files changed, 88 insertions(+), 87 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java index ae6c71ed9b3..079716f3349 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java @@ -78,7 +78,7 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; public class BulkDataExportSvcImpl implements IBulkDataExportSvc { - private static final long REFRESH_INTERVAL = 10 * DateUtils.MILLIS_PER_SECOND; + private static final long JOB_INTERVAL_MILLIS = 10 * DateUtils.MILLIS_PER_SECOND; private static final Logger ourLog = LoggerFactory.getLogger(BulkDataExportSvcImpl.class); private int myReuseBulkExportForMillis = (int) (60 * DateUtils.MILLIS_PER_MINUTE); @@ -311,13 +311,23 @@ public class BulkDataExportSvcImpl implements IBulkDataExportSvc { @PostConstruct public void start() { - ourLog.info("Bulk export service starting with refresh interval {}", StopWatch.formatMillis(REFRESH_INTERVAL)); + ourLog.info("Bulk export service starting with refresh interval {}", StopWatch.formatMillis(JOB_INTERVAL_MILLIS)); myTxTemplate = new TransactionTemplate(myTxManager); ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); - jobDetail.setId(BulkDataExportSvcImpl.class.getName()); - jobDetail.setJobClass(BulkDataExportSvcImpl.SubmitJob.class); - mySchedulerService.scheduleFixedDelayClustered(REFRESH_INTERVAL, jobDetail); + jobDetail.setId(this.getClass().getName()); + jobDetail.setJobClass(Job.class); + mySchedulerService.scheduleFixedDelayClustered(JOB_INTERVAL_MILLIS, jobDetail); + } + + public static class Job implements HapiJob { + @Autowired + private IBulkDataExportSvc myTarget; + + @Override + public void execute(JobExecutionContext theContext) { + myTarget.buildExportFiles(); + } } @Transactional @@ -466,16 +476,4 @@ public class BulkDataExportSvcImpl implements IBulkDataExportSvc { return null; }); } - - public static class SubmitJob implements HapiJob { - @Autowired - private IBulkDataExportSvc myTarget; - - @Override - public void execute(JobExecutionContext theContext) { - myTarget.buildExportFiles(); - } - } - - } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java index 18a73dd8090..87f2f3e0ac3 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java @@ -45,7 +45,7 @@ import java.util.*; @Component public class CacheWarmingSvcImpl implements ICacheWarmingSvc { - public static final long SCHEDULED_JOB_INTERVAL = 10 * DateUtils.MILLIS_PER_SECOND; + public static final long JOB_INTERVAL_MILLIS = 10 * DateUtils.MILLIS_PER_SECOND; private static final Logger ourLog = LoggerFactory.getLogger(CacheWarmingSvcImpl.class); @Autowired private DaoConfig myDaoConfig; @@ -81,14 +81,6 @@ public class CacheWarmingSvcImpl implements ICacheWarmingSvc { } - @PostConstruct - public void registerScheduledJob() { - ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); - jobDetail.setId(CacheWarmingSvcImpl.class.getName()); - jobDetail.setJobClass(CacheWarmingSvcImpl.SubmitJob.class); - mySchedulerService.scheduleFixedDelayClustered(SCHEDULED_JOB_INTERVAL, jobDetail); - } - private void refreshNow(WarmCacheEntry theCacheEntry) { String nextUrl = theCacheEntry.getUrl(); @@ -111,6 +103,24 @@ public class CacheWarmingSvcImpl implements ICacheWarmingSvc { @PostConstruct public void start() { initCacheMap(); + scheduleJob(); + } + + public void scheduleJob() { + ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); + jobDetail.setId(this.getClass().getName()); + jobDetail.setJobClass(Job.class); + mySchedulerService.scheduleFixedDelayClustered(JOB_INTERVAL_MILLIS, jobDetail); + } + + public static class Job implements HapiJob { + @Autowired + private ICacheWarmingSvc myTarget; + + @Override + public void execute(JobExecutionContext theContext) { + myTarget.performWarmingPass(); + } } public synchronized Set initCacheMap() { @@ -127,16 +137,5 @@ public class CacheWarmingSvcImpl implements ICacheWarmingSvc { } return Collections.unmodifiableSet(myCacheEntryToNextRefresh.keySet()); - - } - - public static class SubmitJob implements HapiJob { - @Autowired - private ICacheWarmingSvc myTarget; - - @Override - public void execute(JobExecutionContext theContext) { - myTarget.performWarmingPass(); - } } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java index 10743b1eb5b..4e9fac5efc6 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java @@ -75,7 +75,7 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; @Service public class SubscriptionTriggeringSvcImpl implements ISubscriptionTriggeringSvc { - public static final long SCHEDULE_DELAY = DateUtils.MILLIS_PER_SECOND; + public static final long JOB_INTERVAL_MILLIS = DateUtils.MILLIS_PER_SECOND; private static final Logger ourLog = LoggerFactory.getLogger(SubscriptionTriggeringProvider.class); private static final int DEFAULT_MAX_SUBMIT = 10000; private final List myActiveJobs = new ArrayList<>(); @@ -157,14 +157,6 @@ public class SubscriptionTriggeringSvcImpl implements ISubscriptionTriggeringSvc return retVal; } - @PostConstruct - public void registerScheduledJob() { - ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); - jobDetail.setId(SubscriptionTriggeringSvcImpl.class.getName()); - jobDetail.setJobClass(SubscriptionTriggeringSvcImpl.SubmitJob.class); - mySchedulerService.scheduleFixedDelayLocal(SCHEDULE_DELAY, jobDetail); - } - @Override public void runDeliveryPass() { @@ -354,6 +346,11 @@ public class SubscriptionTriggeringSvcImpl implements ISubscriptionTriggeringSvc @PostConstruct public void start() { + createExecutorService(); + scheduleJob(); + } + + private void createExecutorService() { LinkedBlockingQueue executorQueue = new LinkedBlockingQueue<>(1000); BasicThreadFactory threadFactory = new BasicThreadFactory.Builder() .namingPattern("SubscriptionTriggering-%d") @@ -384,10 +381,16 @@ public class SubscriptionTriggeringSvcImpl implements ISubscriptionTriggeringSvc executorQueue, threadFactory, rejectedExecutionHandler); - } - public static class SubmitJob implements HapiJob { + private void scheduleJob() { + ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); + jobDetail.setId(this.getClass().getName()); + jobDetail.setJobClass(Job.class); + mySchedulerService.scheduleFixedDelayLocal(JOB_INTERVAL_MILLIS, jobDetail); + } + + public static class Job implements HapiJob { @Autowired private ISubscriptionTriggeringSvc myTarget; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java index 1092c418b6a..a85ccd1f0e9 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java @@ -53,7 +53,7 @@ import java.util.List; public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { - private static final int SCHEDULE_INTERVAL_MILLIS = 5000; + private static final int JOB_INTERVAL_MILLIS = 5000; private static final Logger ourLog = LoggerFactory.getLogger(TermDeferredStorageSvcImpl.class); @Autowired protected ITermConceptDao myConceptDao; @@ -260,13 +260,24 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { } @PostConstruct - public void registerScheduledJob() { + public void scheduleJob() { + // FIXME KHS what does this mean? // Register scheduled job to save deferred concepts // In the future it would be great to make this a cluster-aware task somehow ScheduledJobDefinition jobDefinition = new ScheduledJobDefinition(); - jobDefinition.setId(BaseTermReadSvcImpl.class.getName() + "_saveDeferred"); - jobDefinition.setJobClass(SaveDeferredJob.class); - mySchedulerService.scheduleFixedDelayLocal(SCHEDULE_INTERVAL_MILLIS, jobDefinition); + jobDefinition.setId(this.getClass().getName()); + jobDefinition.setJobClass(Job.class); + mySchedulerService.scheduleFixedDelayLocal(JOB_INTERVAL_MILLIS, jobDefinition); + } + + public static class Job implements HapiJob { + @Autowired + private ITermDeferredStorageSvc myTerminologySvc; + + @Override + public void execute(JobExecutionContext theContext) { + myTerminologySvc.saveDeferred(); + } } @VisibleForTesting @@ -288,15 +299,4 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { void setConceptDaoForUnitTest(ITermConceptDao theConceptDao) { myConceptDao = theConceptDao; } - - public static class SaveDeferredJob implements HapiJob { - @Autowired - private ITermDeferredStorageSvc myTerminologySvc; - - @Override - public void execute(JobExecutionContext theContext) { - myTerminologySvc.saveDeferred(); - } - } - } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java index b206fcbc1a0..bb4af70c671 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java @@ -54,7 +54,7 @@ import static org.apache.commons.lang3.StringUtils.isBlank; public class TermReindexingSvcImpl implements ITermReindexingSvc { private static final Logger ourLog = LoggerFactory.getLogger(TermReindexingSvcImpl.class); - private static final long SCHEDULE_INTERVAL_MILLIS = DateUtils.MILLIS_PER_MINUTE; + private static final long JOB_INTERVAL_MILLIS = DateUtils.MILLIS_PER_MINUTE; private static boolean ourForceSaveDeferredAlwaysForUnitTest; @Autowired protected ITermConceptDao myConceptDao; @@ -150,16 +150,17 @@ public class TermReindexingSvcImpl implements ITermReindexingSvc { } @PostConstruct - public void registerScheduledJob() { + public void scheduleJob() { + // FIXME KHS what does this mean? // Register scheduled job to save deferred concepts // In the future it would be great to make this a cluster-aware task somehow ScheduledJobDefinition jobDefinition = new ScheduledJobDefinition(); - jobDefinition.setId(TermReindexingSvcImpl.class.getName() + "_reindex"); - jobDefinition.setJobClass(SaveDeferredJob.class); - mySchedulerService.scheduleFixedDelayLocal(SCHEDULE_INTERVAL_MILLIS, jobDefinition); + jobDefinition.setId(this.getClass().getName()); + jobDefinition.setJobClass(Job.class); + mySchedulerService.scheduleFixedDelayLocal(JOB_INTERVAL_MILLIS, jobDefinition); } - public static class SaveDeferredJob implements HapiJob { + public static class Job implements HapiJob { @Autowired private ITermDeferredStorageSvc myTerminologySvc; diff --git a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java index 6cf22a2a5c1..bd51a3646aa 100644 --- a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java +++ b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java @@ -22,9 +22,9 @@ package ca.uhn.fhir.jpa.model.sched; import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; -import org.quartz.PersistJobDataAfterExecution; @DisallowConcurrentExecution -@PersistJobDataAfterExecution +// FIXME KHS need this? +// @PersistJobDataAfterExecution public interface HapiJob extends Job { } diff --git a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java index d49c490dc16..6322ec2669a 100644 --- a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java +++ b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java @@ -50,7 +50,7 @@ import java.util.concurrent.Semaphore; @Service @Lazy public class SubscriptionLoader { - public static final long REFRESH_INTERVAL = DateUtils.MILLIS_PER_MINUTE; + public static final long JOB_INTERVAL_MILLIS = DateUtils.MILLIS_PER_MINUTE; private static final Logger ourLog = LoggerFactory.getLogger(SubscriptionLoader.class); private static final int MAX_RETRIES = 60; // 60 * 5 seconds = 5 minutes private final Object mySyncSubscriptionsLock = new Object(); @@ -88,11 +88,21 @@ public class SubscriptionLoader { @PostConstruct - public void registerScheduledJob() { + public void scheduleJob() { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); - jobDetail.setId(SubscriptionLoader.class.getName()); - jobDetail.setJobClass(SubscriptionLoader.SubmitJob.class); - mySchedulerService.scheduleFixedDelayLocal(REFRESH_INTERVAL, jobDetail); + jobDetail.setId(this.getClass().getName()); + jobDetail.setJobClass(Job.class); + mySchedulerService.scheduleFixedDelayLocal(JOB_INTERVAL_MILLIS, jobDetail); + } + + public static class Job implements HapiJob { + @Autowired + private SubscriptionLoader myTarget; + + @Override + public void execute(JobExecutionContext theContext) { + myTarget.syncSubscriptions(); + } } @VisibleForTesting @@ -157,15 +167,5 @@ public class SubscriptionLoader { public void setSubscriptionProviderForUnitTest(ISubscriptionProvider theSubscriptionProvider) { mySubscriptionProvider = theSubscriptionProvider; } - - public static class SubmitJob implements HapiJob { - @Autowired - private SubscriptionLoader myTarget; - - @Override - public void execute(JobExecutionContext theContext) { - myTarget.syncSubscriptions(); - } - } } From 37eef4e3e47a82d7ae25fedb69139a18ae4523dc Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Fri, 29 Nov 2019 11:04:35 -0500 Subject: [PATCH 15/34] rename schedule interface methods --- .../java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java | 2 +- .../ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java | 4 ++-- .../uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java | 2 +- .../uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java | 2 +- .../jpa/search/reindex/ResourceReindexingSvcImpl.java | 2 +- .../ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java | 2 +- .../jpa/subscription/SubscriptionTriggeringSvcImpl.java | 2 +- .../java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java | 2 +- .../ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java | 2 +- .../java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java | 2 +- .../java/ca/uhn/fhir/jpa/util/ResourceCountCache.java | 2 +- .../ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java | 8 ++++---- .../jpa/searchparam/registry/SearchParamRegistryImpl.java | 2 +- .../jpa/subscription/module/cache/SubscriptionLoader.java | 2 +- .../ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java | 2 +- .../ca/uhn/fhir/rest/server/sched/ISchedulerService.java | 4 ++-- 16 files changed, 21 insertions(+), 21 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java index 079716f3349..28eef3ca134 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java @@ -317,7 +317,7 @@ public class BulkDataExportSvcImpl implements IBulkDataExportSvc { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(this.getClass().getName()); jobDetail.setJobClass(Job.class); - mySchedulerService.scheduleFixedDelayClustered(JOB_INTERVAL_MILLIS, jobDetail); + mySchedulerService.scheduleClusteredJob(JOB_INTERVAL_MILLIS, jobDetail); } public static class Job implements HapiJob { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java index 67d03b15c74..63890c79ef4 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java @@ -172,12 +172,12 @@ public abstract class BaseSchedulerServiceImpl implements ISchedulerService, Sma } @Override - public void scheduleFixedDelayLocal(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { + public void scheduleLocalJob(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { myLocalScheduler.scheduleFixedDelay(theIntervalMillis, theJobDefinition); } @Override - public void scheduleFixedDelayClustered(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { + public void scheduleClusteredJob(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { myClusteredScheduler.scheduleFixedDelay(theIntervalMillis, theJobDefinition); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java index 59ed9cad15b..344aa567cc2 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java @@ -62,7 +62,7 @@ public class StaleSearchDeletingSvcImpl implements IStaleSearchDeletingSvc { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(StaleSearchDeletingSvcImpl.class.getName()); jobDetail.setJobClass(StaleSearchDeletingSvcImpl.SubmitJob.class); - mySchedulerService.scheduleFixedDelayClustered(DEFAULT_CUTOFF_SLACK, jobDetail); + mySchedulerService.scheduleClusteredJob(DEFAULT_CUTOFF_SLACK, jobDetail); } @Transactional(propagation = Propagation.NEVER) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java index 601e6af2425..8498e2f2aa4 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java @@ -55,7 +55,7 @@ public abstract class BaseSearchCacheSvcImpl implements ISearchCacheSvc { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(BaseSearchCacheSvcImpl.class.getName()); jobDetail.setJobClass(BaseSearchCacheSvcImpl.SubmitJob.class); - mySchedulerService.scheduleFixedDelayLocal(10 * DateUtils.MILLIS_PER_SECOND, jobDetail); + mySchedulerService.scheduleLocalJob(10 * DateUtils.MILLIS_PER_SECOND, jobDetail); } @Override diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java index 08e6ae1b582..9f1dd642c34 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java @@ -192,7 +192,7 @@ public class ResourceReindexingSvcImpl implements IResourceReindexingSvc { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(ResourceReindexingSvcImpl.class.getName()); jobDetail.setJobClass(ResourceReindexingSvcImpl.SubmitJob.class); - mySchedulerService.scheduleFixedDelayClustered(10 * DateUtils.MILLIS_PER_SECOND, jobDetail); + mySchedulerService.scheduleClusteredJob(10 * DateUtils.MILLIS_PER_SECOND, jobDetail); } @VisibleForTesting diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java index 87f2f3e0ac3..1be81f136b1 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java @@ -110,7 +110,7 @@ public class CacheWarmingSvcImpl implements ICacheWarmingSvc { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(this.getClass().getName()); jobDetail.setJobClass(Job.class); - mySchedulerService.scheduleFixedDelayClustered(JOB_INTERVAL_MILLIS, jobDetail); + mySchedulerService.scheduleClusteredJob(JOB_INTERVAL_MILLIS, jobDetail); } public static class Job implements HapiJob { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java index 4e9fac5efc6..a2b8195550b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java @@ -387,7 +387,7 @@ public class SubscriptionTriggeringSvcImpl implements ISubscriptionTriggeringSvc ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(this.getClass().getName()); jobDetail.setJobClass(Job.class); - mySchedulerService.scheduleFixedDelayLocal(JOB_INTERVAL_MILLIS, jobDetail); + mySchedulerService.scheduleLocalJob(JOB_INTERVAL_MILLIS, jobDetail); } public static class Job implements HapiJob { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index c1cbc34e1b9..c1571dbcc13 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -1309,7 +1309,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc, ApplicationCo ScheduledJobDefinition vsJobDefinition = new ScheduledJobDefinition(); vsJobDefinition.setId(BaseTermReadSvcImpl.class.getName() + "_preExpandValueSets"); vsJobDefinition.setJobClass(PreExpandValueSetsJob.class); - mySchedulerService.scheduleFixedDelayClustered(10 * DateUtils.MILLIS_PER_MINUTE, vsJobDefinition); + mySchedulerService.scheduleClusteredJob(10 * DateUtils.MILLIS_PER_MINUTE, vsJobDefinition); } @Override diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java index a85ccd1f0e9..d2bfe93a0d8 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java @@ -267,7 +267,7 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { ScheduledJobDefinition jobDefinition = new ScheduledJobDefinition(); jobDefinition.setId(this.getClass().getName()); jobDefinition.setJobClass(Job.class); - mySchedulerService.scheduleFixedDelayLocal(JOB_INTERVAL_MILLIS, jobDefinition); + mySchedulerService.scheduleLocalJob(JOB_INTERVAL_MILLIS, jobDefinition); } public static class Job implements HapiJob { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java index bb4af70c671..3b9ab65bb8f 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java @@ -157,7 +157,7 @@ public class TermReindexingSvcImpl implements ITermReindexingSvc { ScheduledJobDefinition jobDefinition = new ScheduledJobDefinition(); jobDefinition.setId(this.getClass().getName()); jobDefinition.setJobClass(Job.class); - mySchedulerService.scheduleFixedDelayLocal(JOB_INTERVAL_MILLIS, jobDefinition); + mySchedulerService.scheduleLocalJob(JOB_INTERVAL_MILLIS, jobDefinition); } public static class Job implements HapiJob { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java index 3ed6cb79be8..cdda4d28c50 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java @@ -96,7 +96,7 @@ public class ResourceCountCache { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(ResourceCountCache.class.getName()); jobDetail.setJobClass(ResourceCountCache.SubmitJob.class); - mySchedulerService.scheduleFixedDelayLocal(10 * DateUtils.MILLIS_PER_MINUTE, jobDetail); + mySchedulerService.scheduleLocalJob(10 * DateUtils.MILLIS_PER_MINUTE, jobDetail); } public static class SubmitJob implements Job { diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java index b290725cc56..dc4e2603d97 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java @@ -51,7 +51,7 @@ public class SchedulerServiceImplTest { .setId(CountingJob.class.getName()) .setJobClass(CountingJob.class); - mySvc.scheduleFixedDelayLocal(100, def); + mySvc.scheduleLocalJob(100, def); sleepAtLeast(1000); @@ -73,7 +73,7 @@ public class SchedulerServiceImplTest { svc.create(); svc.start(); - mySvc.scheduleFixedDelayLocal(100, def); + mySvc.scheduleLocalJob(100, def); sleepAtLeast(1000); @@ -91,7 +91,7 @@ public class SchedulerServiceImplTest { .setJobClass(CountingJob.class); ourTaskDelay = 500; - mySvc.scheduleFixedDelayLocal(100, def); + mySvc.scheduleLocalJob(100, def); sleepAtLeast(1000); @@ -109,7 +109,7 @@ public class SchedulerServiceImplTest { .setJobClass(CountingIntervalJob.class); ourTaskDelay = 500; - mySvc.scheduleFixedDelayLocal(100, def); + mySvc.scheduleLocalJob(100, def); sleepAtLeast(2000); diff --git a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java index a7b53c2f4e6..88ce3f0ef8a 100644 --- a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java +++ b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java @@ -728,7 +728,7 @@ public class SearchParamRegistryImpl implements ISearchParamRegistry { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(SearchParamRegistryImpl.class.getName()); jobDetail.setJobClass(SubmitJob.class); - mySchedulerService.scheduleFixedDelayLocal(10 * DateUtils.MILLIS_PER_SECOND, jobDetail); + mySchedulerService.scheduleLocalJob(10 * DateUtils.MILLIS_PER_SECOND, jobDetail); } @Override diff --git a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java index 6322ec2669a..6456d2d6e5b 100644 --- a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java +++ b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java @@ -92,7 +92,7 @@ public class SubscriptionLoader { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(this.getClass().getName()); jobDetail.setJobClass(Job.class); - mySchedulerService.scheduleFixedDelayLocal(JOB_INTERVAL_MILLIS, jobDetail); + mySchedulerService.scheduleLocalJob(JOB_INTERVAL_MILLIS, jobDetail); } public static class Job implements HapiJob { diff --git a/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java b/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java index bef3211fafa..6d6a5a699c6 100644 --- a/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java +++ b/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java @@ -70,7 +70,7 @@ public class AnalyticsInterceptor extends InterceptorAdapter { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); jobDetail.setId(getClass().getName()); jobDetail.setJobClass(SubmitJob.class); - mySchedulerService.scheduleFixedDelayLocal(5000, jobDetail); + mySchedulerService.scheduleLocalJob(5000, jobDetail); } @PreDestroy diff --git a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerService.java b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerService.java index d413edb273e..41982565053 100644 --- a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerService.java +++ b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerService.java @@ -35,14 +35,14 @@ public interface ISchedulerService { * @param theIntervalMillis How many milliseconds between passes should this job run * @param theJobDefinition The Job to fire */ - void scheduleFixedDelayLocal(long theIntervalMillis, ScheduledJobDefinition theJobDefinition); + void scheduleLocalJob(long theIntervalMillis, ScheduledJobDefinition theJobDefinition); /** * This task will execute locally (and should execute on all nodes of the cluster if there is a cluster) * @param theIntervalMillis How many milliseconds between passes should this job run * @param theJobDefinition The Job to fire */ - void scheduleFixedDelayClustered(long theIntervalMillis, ScheduledJobDefinition theJobDefinition); + void scheduleClusteredJob(long theIntervalMillis, ScheduledJobDefinition theJobDefinition); boolean isStopping(); } From f92c2bb5f921916f005417c7e1c55db1a3634ad6 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Fri, 29 Nov 2019 11:46:03 -0500 Subject: [PATCH 16/34] ensure only one @PostConstruct method to make order explicit --- .../fhir/jpa/bulk/BulkDataExportSvcImpl.java | 6 +- .../uhn/fhir/jpa/sched/BaseHapiScheduler.java | 2 +- .../jpa/sched/BaseSchedulerServiceImpl.java | 7 +- .../uhn/fhir/jpa/sched/HapiNullScheduler.java | 2 +- .../search/StaleSearchDeletingSvcImpl.java | 28 ++++---- .../search/cache/BaseSearchCacheSvcImpl.java | 10 +-- .../reindex/ResourceReindexingSvcImpl.java | 34 +++++----- .../jpa/search/warm/CacheWarmingSvcImpl.java | 5 +- .../SubscriptionTriggeringSvcImpl.java | 5 +- .../fhir/jpa/term/BaseTermReadSvcImpl.java | 66 +++++++++---------- .../jpa/term/TermDeferredStorageSvcImpl.java | 3 +- .../fhir/jpa/term/TermReindexingSvcImpl.java | 3 +- .../uhn/fhir/jpa/util/ResourceCountCache.java | 10 +-- .../registry/SearchParamRegistryImpl.java | 29 ++++---- .../module/cache/SubscriptionLoader.java | 5 +- .../interceptor/AnalyticsInterceptor.java | 20 +++--- .../rest/server/sched/IHapiScheduler.java | 2 +- 17 files changed, 116 insertions(+), 121 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java index 28eef3ca134..379f5877e2e 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java @@ -78,7 +78,6 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; public class BulkDataExportSvcImpl implements IBulkDataExportSvc { - private static final long JOB_INTERVAL_MILLIS = 10 * DateUtils.MILLIS_PER_SECOND; private static final Logger ourLog = LoggerFactory.getLogger(BulkDataExportSvcImpl.class); private int myReuseBulkExportForMillis = (int) (60 * DateUtils.MILLIS_PER_MINUTE); @@ -311,13 +310,12 @@ public class BulkDataExportSvcImpl implements IBulkDataExportSvc { @PostConstruct public void start() { - ourLog.info("Bulk export service starting with refresh interval {}", StopWatch.formatMillis(JOB_INTERVAL_MILLIS)); myTxTemplate = new TransactionTemplate(myTxManager); ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); - jobDetail.setId(this.getClass().getName()); + jobDetail.setId(getClass().getName()); jobDetail.setJobClass(Job.class); - mySchedulerService.scheduleClusteredJob(JOB_INTERVAL_MILLIS, jobDetail); + mySchedulerService.scheduleClusteredJob(10 * DateUtils.MILLIS_PER_SECOND, jobDetail); } public static class Job implements HapiJob { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java index aa52534d0d7..b08faf872aa 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java @@ -113,7 +113,7 @@ public abstract class BaseHapiScheduler implements IHapiScheduler { } @Override - public void scheduleFixedDelay(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { + public void scheduleJob(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { Validate.isTrue(theIntervalMillis >= 100); Validate.notNull(theJobDefinition); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java index 63890c79ef4..a96887bf93b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java @@ -25,6 +25,7 @@ import ca.uhn.fhir.model.api.ISmartLifecyclePhase; import ca.uhn.fhir.rest.server.sched.IHapiScheduler; import ca.uhn.fhir.rest.server.sched.ISchedulerService; import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; +import ca.uhn.fhir.util.StopWatch; import org.quartz.SchedulerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -173,12 +174,14 @@ public abstract class BaseSchedulerServiceImpl implements ISchedulerService, Sma @Override public void scheduleLocalJob(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { - myLocalScheduler.scheduleFixedDelay(theIntervalMillis, theJobDefinition); + ourLog.info("Scheduling local job {} with interval {}", theJobDefinition.getId(), StopWatch.formatMillis(theIntervalMillis)); + myLocalScheduler.scheduleJob(theIntervalMillis, theJobDefinition); } @Override public void scheduleClusteredJob(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { - myClusteredScheduler.scheduleFixedDelay(theIntervalMillis, theJobDefinition); + ourLog.info("Scheduling clustered job {} with interval {}", theJobDefinition.getId(), StopWatch.formatMillis(theIntervalMillis)); + myClusteredScheduler.scheduleJob(theIntervalMillis, theJobDefinition); } private boolean isSchedulingDisabledForUnitTests() { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java index 1a24907098b..672820e80d5 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java @@ -40,7 +40,7 @@ public class HapiNullScheduler implements IHapiScheduler { } @Override - public void scheduleFixedDelay(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { + public void scheduleJob(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { ourLog.debug("Skipping scheduling job {} since scheduling is disabled", theJobDefinition.getId()); } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java index 344aa567cc2..72390b808f7 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java @@ -21,10 +21,10 @@ package ca.uhn.fhir.jpa.search; */ import ca.uhn.fhir.jpa.dao.DaoConfig; +import ca.uhn.fhir.jpa.model.sched.HapiJob; import ca.uhn.fhir.jpa.search.cache.ISearchCacheSvc; import ca.uhn.fhir.rest.server.sched.ISchedulerService; import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; -import org.quartz.Job; import org.quartz.JobExecutionContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Propagation; @@ -58,13 +58,23 @@ public class StaleSearchDeletingSvcImpl implements IStaleSearchDeletingSvc { } @PostConstruct - public void registerScheduledJob() { + public void scheduleJob() { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); - jobDetail.setId(StaleSearchDeletingSvcImpl.class.getName()); - jobDetail.setJobClass(StaleSearchDeletingSvcImpl.SubmitJob.class); + jobDetail.setId(getClass().getName()); + jobDetail.setJobClass(Job.class); mySchedulerService.scheduleClusteredJob(DEFAULT_CUTOFF_SLACK, jobDetail); } + public static class Job implements HapiJob { + @Autowired + private IStaleSearchDeletingSvc myTarget; + + @Override + public void execute(JobExecutionContext theContext) { + myTarget.schedulePollForStaleSearches(); + } + } + @Transactional(propagation = Propagation.NEVER) @Override public synchronized void schedulePollForStaleSearches() { @@ -72,14 +82,4 @@ public class StaleSearchDeletingSvcImpl implements IStaleSearchDeletingSvc { pollForStaleSearchesAndDeleteThem(); } } - - public static class SubmitJob implements Job { - @Autowired - private IStaleSearchDeletingSvc myTarget; - - @Override - public void execute(JobExecutionContext theContext) { - myTarget.schedulePollForStaleSearches(); - } - } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java index 8498e2f2aa4..4716a8e9aad 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java @@ -21,10 +21,10 @@ package ca.uhn.fhir.jpa.search.cache; */ import ca.uhn.fhir.jpa.entity.Search; +import ca.uhn.fhir.jpa.model.sched.HapiJob; import ca.uhn.fhir.rest.server.sched.ISchedulerService; import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import org.apache.commons.lang3.time.DateUtils; -import org.quartz.Job; import org.quartz.JobExecutionContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.PlatformTransactionManager; @@ -51,10 +51,10 @@ public abstract class BaseSearchCacheSvcImpl implements ISearchCacheSvc { } @PostConstruct - public void registerScheduledJob() { + public void scheduleJob() { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); - jobDetail.setId(BaseSearchCacheSvcImpl.class.getName()); - jobDetail.setJobClass(BaseSearchCacheSvcImpl.SubmitJob.class); + jobDetail.setId(getClass().getName()); + jobDetail.setJobClass(Job.class); mySchedulerService.scheduleLocalJob(10 * DateUtils.MILLIS_PER_SECOND, jobDetail); } @@ -73,7 +73,7 @@ public abstract class BaseSearchCacheSvcImpl implements ISearchCacheSvc { protected abstract void flushLastUpdated(Long theSearchId, Date theLastUpdated); - public static class SubmitJob implements Job { + public static class Job implements HapiJob { @Autowired private ISearchCacheSvc myTarget; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java index 9f1dd642c34..98506cfae57 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java @@ -33,6 +33,7 @@ import ca.uhn.fhir.jpa.dao.data.IResourceTableDao; import ca.uhn.fhir.jpa.entity.ResourceReindexJobEntity; import ca.uhn.fhir.jpa.model.entity.ForcedId; import ca.uhn.fhir.jpa.model.entity.ResourceTable; +import ca.uhn.fhir.jpa.model.sched.HapiJob; import ca.uhn.fhir.jpa.searchparam.registry.ISearchParamRegistry; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.ResourceVersionConflictException; @@ -46,7 +47,6 @@ import org.apache.commons.lang3.time.DateUtils; import org.hibernate.search.util.impl.Executors; import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.r4.model.InstantType; -import org.quartz.Job; import org.quartz.JobExecutionContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -146,6 +146,7 @@ public class ResourceReindexingSvcImpl implements IResourceReindexingSvc { public void start() { myTxTemplate = new TransactionTemplate(myTxManager); initExecutor(); + scheduleJob(); } public void initExecutor() { @@ -160,6 +161,13 @@ public class ResourceReindexingSvcImpl implements IResourceReindexingSvc { ); } + public void scheduleJob() { + ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); + jobDetail.setId(getClass().getName()); + jobDetail.setJobClass(Job.class); + mySchedulerService.scheduleClusteredJob(10 * DateUtils.MILLIS_PER_SECOND, jobDetail); + } + @Override @Transactional(Transactional.TxType.REQUIRED) public Long markAllResourcesForReindexing() { @@ -187,12 +195,14 @@ public class ResourceReindexingSvcImpl implements IResourceReindexingSvc { return job.getId(); } - @PostConstruct - public void registerScheduledJob() { - ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); - jobDetail.setId(ResourceReindexingSvcImpl.class.getName()); - jobDetail.setJobClass(ResourceReindexingSvcImpl.SubmitJob.class); - mySchedulerService.scheduleClusteredJob(10 * DateUtils.MILLIS_PER_SECOND, jobDetail); + public static class Job implements HapiJob { + @Autowired + private IResourceReindexingSvc myTarget; + + @Override + public void execute(JobExecutionContext theContext) { + myTarget.runReindexingPass(); + } } @VisibleForTesting @@ -545,14 +555,4 @@ public class ResourceReindexingSvcImpl implements IResourceReindexingSvc { return myUpdated; } } - - public static class SubmitJob implements Job { - @Autowired - private IResourceReindexingSvc myTarget; - - @Override - public void execute(JobExecutionContext theContext) { - myTarget.runReindexingPass(); - } - } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java index 1be81f136b1..f5b42d451e3 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java @@ -45,7 +45,6 @@ import java.util.*; @Component public class CacheWarmingSvcImpl implements ICacheWarmingSvc { - public static final long JOB_INTERVAL_MILLIS = 10 * DateUtils.MILLIS_PER_SECOND; private static final Logger ourLog = LoggerFactory.getLogger(CacheWarmingSvcImpl.class); @Autowired private DaoConfig myDaoConfig; @@ -108,9 +107,9 @@ public class CacheWarmingSvcImpl implements ICacheWarmingSvc { public void scheduleJob() { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); - jobDetail.setId(this.getClass().getName()); + jobDetail.setId(getClass().getName()); jobDetail.setJobClass(Job.class); - mySchedulerService.scheduleClusteredJob(JOB_INTERVAL_MILLIS, jobDetail); + mySchedulerService.scheduleClusteredJob(10 * DateUtils.MILLIS_PER_SECOND, jobDetail); } public static class Job implements HapiJob { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java index a2b8195550b..7c77954356d 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java @@ -75,7 +75,6 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; @Service public class SubscriptionTriggeringSvcImpl implements ISubscriptionTriggeringSvc { - public static final long JOB_INTERVAL_MILLIS = DateUtils.MILLIS_PER_SECOND; private static final Logger ourLog = LoggerFactory.getLogger(SubscriptionTriggeringProvider.class); private static final int DEFAULT_MAX_SUBMIT = 10000; private final List myActiveJobs = new ArrayList<>(); @@ -385,9 +384,9 @@ public class SubscriptionTriggeringSvcImpl implements ISubscriptionTriggeringSvc private void scheduleJob() { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); - jobDetail.setId(this.getClass().getName()); + jobDetail.setId(getClass().getName()); jobDetail.setJobClass(Job.class); - mySchedulerService.scheduleLocalJob(JOB_INTERVAL_MILLIS, jobDetail); + mySchedulerService.scheduleLocalJob(DateUtils.MILLIS_PER_SECOND, jobDetail); } public static class Job implements HapiJob { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index c1571dbcc13..a9417069e3d 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -30,6 +30,7 @@ import ca.uhn.fhir.jpa.entity.*; import ca.uhn.fhir.jpa.entity.TermConceptParentChildLink.RelationshipTypeEnum; import ca.uhn.fhir.jpa.model.cross.ResourcePersistentId; import ca.uhn.fhir.jpa.model.entity.ResourceTable; +import ca.uhn.fhir.jpa.model.sched.HapiJob; import ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermDeferredStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermLoaderSvc; @@ -69,7 +70,6 @@ import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IPrimitiveType; import org.hl7.fhir.r4.model.*; import org.hl7.fhir.r4.model.codesystems.ConceptSubsumptionOutcome; -import org.quartz.Job; import org.quartz.JobExecutionContext; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; @@ -206,23 +206,6 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc, ApplicationCo return retVal; } - @PostConstruct - public void buildTranslationCaches() { - Long timeout = myDaoConfig.getTranslationCachesExpireAfterWriteInMinutes(); - - myTranslationCache = - Caffeine.newBuilder() - .maximumSize(10000) - .expireAfterWrite(timeout, TimeUnit.MINUTES) - .build(); - - myTranslationWithReverseCache = - Caffeine.newBuilder() - .maximumSize(10000) - .expireAfterWrite(timeout, TimeUnit.MINUTES) - .build(); - } - /** * This method is present only for unit tests, do not call from client code */ @@ -1300,18 +1283,46 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc, ApplicationCo RuleBasedTransactionAttribute rules = new RuleBasedTransactionAttribute(); rules.getRollbackRules().add(new NoRollbackRuleAttribute(ExpansionTooCostlyException.class)); myTxTemplate = new TransactionTemplate(myTransactionManager, rules); + buildTranslationCaches(); + scheduleJob(); } - @PostConstruct - public void registerScheduledJob() { + private void buildTranslationCaches() { + Long timeout = myDaoConfig.getTranslationCachesExpireAfterWriteInMinutes(); + + myTranslationCache = + Caffeine.newBuilder() + .maximumSize(10000) + .expireAfterWrite(timeout, TimeUnit.MINUTES) + .build(); + + myTranslationWithReverseCache = + Caffeine.newBuilder() + .maximumSize(10000) + .expireAfterWrite(timeout, TimeUnit.MINUTES) + .build(); + } + + public void scheduleJob() { + // FIXME KHS what does this mean? // Register scheduled job to pre-expand ValueSets // In the future it would be great to make this a cluster-aware task somehow ScheduledJobDefinition vsJobDefinition = new ScheduledJobDefinition(); - vsJobDefinition.setId(BaseTermReadSvcImpl.class.getName() + "_preExpandValueSets"); - vsJobDefinition.setJobClass(PreExpandValueSetsJob.class); + vsJobDefinition.setId(getClass().getName()); + vsJobDefinition.setJobClass(Job.class); mySchedulerService.scheduleClusteredJob(10 * DateUtils.MILLIS_PER_MINUTE, vsJobDefinition); } + public static class Job implements HapiJob { + @Autowired + private ITermReadSvc myTerminologySvc; + + @Override + public void execute(JobExecutionContext theContext) { + myTerminologySvc.preExpandDeferredValueSetsToTerminologyTables(); + } + } + @Override @Transactional public void storeTermConceptMapAndChildren(ResourceTable theResourceTable, ConceptMap theConceptMap) { @@ -1865,17 +1876,6 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc, ApplicationCo .findFirst(); } - public static class PreExpandValueSetsJob implements Job { - - @Autowired - private ITermReadSvc myTerminologySvc; - - @Override - public void execute(JobExecutionContext theContext) { - myTerminologySvc.preExpandDeferredValueSetsToTerminologyTables(); - } - } - static List toPersistedConcepts(List theConcept, TermCodeSystemVersion theCodeSystemVersion) { ArrayList retVal = new ArrayList<>(); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java index d2bfe93a0d8..ccda37d2a51 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java @@ -53,7 +53,6 @@ import java.util.List; public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { - private static final int JOB_INTERVAL_MILLIS = 5000; private static final Logger ourLog = LoggerFactory.getLogger(TermDeferredStorageSvcImpl.class); @Autowired protected ITermConceptDao myConceptDao; @@ -267,7 +266,7 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { ScheduledJobDefinition jobDefinition = new ScheduledJobDefinition(); jobDefinition.setId(this.getClass().getName()); jobDefinition.setJobClass(Job.class); - mySchedulerService.scheduleLocalJob(JOB_INTERVAL_MILLIS, jobDefinition); + mySchedulerService.scheduleLocalJob(5000, jobDefinition); } public static class Job implements HapiJob { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java index 3b9ab65bb8f..01746cd0b0c 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java @@ -54,7 +54,6 @@ import static org.apache.commons.lang3.StringUtils.isBlank; public class TermReindexingSvcImpl implements ITermReindexingSvc { private static final Logger ourLog = LoggerFactory.getLogger(TermReindexingSvcImpl.class); - private static final long JOB_INTERVAL_MILLIS = DateUtils.MILLIS_PER_MINUTE; private static boolean ourForceSaveDeferredAlwaysForUnitTest; @Autowired protected ITermConceptDao myConceptDao; @@ -157,7 +156,7 @@ public class TermReindexingSvcImpl implements ITermReindexingSvc { ScheduledJobDefinition jobDefinition = new ScheduledJobDefinition(); jobDefinition.setId(this.getClass().getName()); jobDefinition.setJobClass(Job.class); - mySchedulerService.scheduleLocalJob(JOB_INTERVAL_MILLIS, jobDefinition); + mySchedulerService.scheduleLocalJob(DateUtils.MILLIS_PER_MINUTE, jobDefinition); } public static class Job implements HapiJob { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java index cdda4d28c50..27ef82db650 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java @@ -20,12 +20,12 @@ package ca.uhn.fhir.jpa.util; * #L% */ +import ca.uhn.fhir.jpa.model.sched.HapiJob; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.sched.ISchedulerService; import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang3.time.DateUtils; -import org.quartz.Job; import org.quartz.JobExecutionContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -92,14 +92,14 @@ public class ResourceCountCache { } @PostConstruct - public void registerScheduledJob() { + public void scheduleJob() { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); - jobDetail.setId(ResourceCountCache.class.getName()); - jobDetail.setJobClass(ResourceCountCache.SubmitJob.class); + jobDetail.setId(getClass().getName()); + jobDetail.setJobClass(Job.class); mySchedulerService.scheduleLocalJob(10 * DateUtils.MILLIS_PER_MINUTE, jobDetail); } - public static class SubmitJob implements Job { + public static class Job implements HapiJob { @Autowired private ResourceCountCache myTarget; diff --git a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java index 88ce3f0ef8a..8926a84495f 100644 --- a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java +++ b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java @@ -27,6 +27,7 @@ import ca.uhn.fhir.interceptor.api.HookParams; import ca.uhn.fhir.interceptor.api.IInterceptorBroadcaster; import ca.uhn.fhir.interceptor.api.Pointcut; import ca.uhn.fhir.jpa.model.entity.ModelConfig; +import ca.uhn.fhir.jpa.model.sched.HapiJob; import ca.uhn.fhir.jpa.model.search.StorageProcessingMessage; import ca.uhn.fhir.jpa.searchparam.JpaRuntimeSearchParam; import ca.uhn.fhir.jpa.searchparam.SearchParamConstants; @@ -49,7 +50,6 @@ import org.hl7.fhir.dstu3.model.Extension; import org.hl7.fhir.dstu3.model.SearchParameter; import org.hl7.fhir.instance.model.api.*; import org.hl7.fhir.r4.model.Reference; -import org.quartz.Job; import org.quartz.JobExecutionContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -724,13 +724,23 @@ public class SearchParamRegistryImpl implements ISearchParamRegistry { } @PostConstruct - public void registerScheduledJob() { + public void scheduleJob() { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); - jobDetail.setId(SearchParamRegistryImpl.class.getName()); - jobDetail.setJobClass(SubmitJob.class); + jobDetail.setId(getClass().getName()); + jobDetail.setJobClass(Job.class); mySchedulerService.scheduleLocalJob(10 * DateUtils.MILLIS_PER_SECOND, jobDetail); } + public static class Job implements HapiJob { + @Autowired + private ISearchParamRegistry myTarget; + + @Override + public void execute(JobExecutionContext theContext) { + myTarget.refreshCacheIfNecessary(); + } + } + @Override public boolean refreshCacheIfNecessary() { if (myActiveSearchParams == null || System.currentTimeMillis() - REFRESH_INTERVAL > myLastRefresh) { @@ -767,17 +777,6 @@ public class SearchParamRegistryImpl implements ISearchParamRegistry { } } - - public static class SubmitJob implements Job { - @Autowired - private ISearchParamRegistry myTarget; - - @Override - public void execute(JobExecutionContext theContext) { - myTarget.refreshCacheIfNecessary(); - } - } - public static Map> createBuiltInSearchParamMap(FhirContext theFhirContext) { Map> resourceNameToSearchParams = new HashMap<>(); diff --git a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java index 6456d2d6e5b..1b3144a91f4 100644 --- a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java +++ b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java @@ -50,7 +50,6 @@ import java.util.concurrent.Semaphore; @Service @Lazy public class SubscriptionLoader { - public static final long JOB_INTERVAL_MILLIS = DateUtils.MILLIS_PER_MINUTE; private static final Logger ourLog = LoggerFactory.getLogger(SubscriptionLoader.class); private static final int MAX_RETRIES = 60; // 60 * 5 seconds = 5 minutes private final Object mySyncSubscriptionsLock = new Object(); @@ -90,9 +89,9 @@ public class SubscriptionLoader { @PostConstruct public void scheduleJob() { ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); - jobDetail.setId(this.getClass().getName()); + jobDetail.setId(getClass().getName()); jobDetail.setJobClass(Job.class); - mySchedulerService.scheduleLocalJob(JOB_INTERVAL_MILLIS, jobDetail); + mySchedulerService.scheduleLocalJob(DateUtils.MILLIS_PER_MINUTE, jobDetail); } public static class Job implements HapiJob { diff --git a/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java b/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java index 6d6a5a699c6..ca950f33160 100644 --- a/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java +++ b/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java @@ -1,5 +1,6 @@ package ca.uhn.fhirtest.interceptor; +import ca.uhn.fhir.jpa.model.sched.HapiJob; import ca.uhn.fhir.rest.api.RestOperationTypeEnum; import ca.uhn.fhir.rest.client.apache.ApacheRestfulClientFactory; import ca.uhn.fhir.rest.server.interceptor.InterceptorAdapter; @@ -13,7 +14,6 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; -import org.quartz.Job; import org.quartz.JobExecutionContext; import org.springframework.beans.factory.annotation.Autowired; @@ -55,7 +55,15 @@ public class AnalyticsInterceptor extends InterceptorAdapter { } } - public static class SubmitJob implements Job { + @PostConstruct + public void start() { + ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); + jobDetail.setId(getClass().getName()); + jobDetail.setJobClass(Job.class); + mySchedulerService.scheduleLocalJob(5000, jobDetail); + } + + public static class Job implements HapiJob { @Autowired private AnalyticsInterceptor myAnalyticsInterceptor; @@ -65,14 +73,6 @@ public class AnalyticsInterceptor extends InterceptorAdapter { } } - @PostConstruct - public void start() { - ScheduledJobDefinition jobDetail = new ScheduledJobDefinition(); - jobDetail.setId(getClass().getName()); - jobDetail.setJobClass(SubmitJob.class); - mySchedulerService.scheduleLocalJob(5000, jobDetail); - } - @PreDestroy public void stop() throws IOException { if (myHttpClient instanceof CloseableHttpClient) { diff --git a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/IHapiScheduler.java b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/IHapiScheduler.java index 6c40bd0b3fe..6caca26282e 100644 --- a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/IHapiScheduler.java +++ b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/IHapiScheduler.java @@ -15,5 +15,5 @@ public interface IHapiScheduler { void logStatusForUnitTest(); - void scheduleFixedDelay(long theIntervalMillis, ScheduledJobDefinition theJobDefinition); + void scheduleJob(long theIntervalMillis, ScheduledJobDefinition theJobDefinition); } From 0c728a27df5c725e0f2f639787d53c862ba311a6 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Fri, 29 Nov 2019 16:07:38 -0500 Subject: [PATCH 17/34] remove unused mystery class --- .../uhn/fhir/jpa/sched/QuartzTableSeeder.java | 38 ------------------- 1 file changed, 38 deletions(-) delete mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/QuartzTableSeeder.java diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/QuartzTableSeeder.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/QuartzTableSeeder.java deleted file mode 100644 index b780bccd88e..00000000000 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/QuartzTableSeeder.java +++ /dev/null @@ -1,38 +0,0 @@ -package ca.uhn.fhir.jpa.sched; - -/*- - * #%L - * HAPI FHIR JPA Server - * %% - * Copyright (C) 2014 - 2019 University Health Network - * %% - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * #L% - */ - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; - -import javax.annotation.PostConstruct; - -public class QuartzTableSeeder { - - @Autowired - private LocalContainerEntityManagerFactoryBean myEntityManagerFactory; - - @PostConstruct - public void start() { -// FIXME KHS what is this? - } - -} From 959dba76117afdf48c9e0232748fd24cff1ad7e6 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Sun, 1 Dec 2019 16:51:01 -0500 Subject: [PATCH 18/34] pre review cleanup --- .../src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java | 7 ------- .../java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java | 2 +- .../ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java | 2 +- .../java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java | 2 +- .../src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java | 5 +++-- 5 files changed, 6 insertions(+), 12 deletions(-) delete mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java deleted file mode 100644 index b83d74f2052..00000000000 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/NullScheduler.java +++ /dev/null @@ -1,7 +0,0 @@ -package ca.uhn.fhir.jpa.sched; - -class NullScheduler extends BaseHapiScheduler { - public NullScheduler(String theThreadNamePrefix, AutowiringSpringBeanJobFactory theSpringBeanJobFactory) { - super(theThreadNamePrefix, theSpringBeanJobFactory); - } -} diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index a9417069e3d..d2e858e0226 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -1304,7 +1304,7 @@ public abstract class BaseTermReadSvcImpl implements ITermReadSvc, ApplicationCo } public void scheduleJob() { - // FIXME KHS what does this mean? + // TODO KHS what does this mean? // Register scheduled job to pre-expand ValueSets // In the future it would be great to make this a cluster-aware task somehow ScheduledJobDefinition vsJobDefinition = new ScheduledJobDefinition(); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java index ccda37d2a51..82ddfe5dc4d 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java @@ -260,7 +260,7 @@ public class TermDeferredStorageSvcImpl implements ITermDeferredStorageSvc { @PostConstruct public void scheduleJob() { - // FIXME KHS what does this mean? + // TODO KHS what does this mean? // Register scheduled job to save deferred concepts // In the future it would be great to make this a cluster-aware task somehow ScheduledJobDefinition jobDefinition = new ScheduledJobDefinition(); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java index 01746cd0b0c..7fdafcbf7bc 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java @@ -150,7 +150,7 @@ public class TermReindexingSvcImpl implements ITermReindexingSvc { @PostConstruct public void scheduleJob() { - // FIXME KHS what does this mean? + // TODO KHS what does this mean? // Register scheduled job to save deferred concepts // In the future it would be great to make this a cluster-aware task somehow ScheduledJobDefinition jobDefinition = new ScheduledJobDefinition(); diff --git a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java index bd51a3646aa..8135c710a37 100644 --- a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java +++ b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java @@ -22,9 +22,10 @@ package ca.uhn.fhir.jpa.model.sched; import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; +import org.quartz.PersistJobDataAfterExecution; @DisallowConcurrentExecution -// FIXME KHS need this? -// @PersistJobDataAfterExecution +// TODO KHS do we still need this? +@PersistJobDataAfterExecution public interface HapiJob extends Job { } From 993d8220d14ebfed0eecbe83ceac946792e4b91b Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Mon, 2 Dec 2019 11:18:52 -0500 Subject: [PATCH 19/34] review feedback --- hapi-fhir-base/pom.xml | 5 ----- hapi-fhir-jpaserver-base/pom.xml | 7 +++++++ .../ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java | 4 ++-- .../main/java/ca/uhn/fhir/jpa/config/BaseConfig.java | 2 +- .../java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java | 10 +++++----- .../uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java | 8 ++++---- .../java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java | 4 ++-- .../uhn/fhir/jpa/sched/HapiSchedulerServiceImpl.java | 2 +- .../fhir/jpa/search/StaleSearchDeletingSvcImpl.java | 4 ++-- .../fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java | 4 ++-- .../jpa/search/reindex/ResourceReindexingSvcImpl.java | 4 ++-- .../uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java | 4 ++-- .../subscription/SubscriptionTriggeringSvcImpl.java | 4 ++-- .../java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java | 4 ++-- .../uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java | 4 ++-- .../ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java | 4 ++-- .../java/ca/uhn/fhir/jpa/util/ResourceCountCache.java | 4 ++-- .../uhn/fhir/jpa/sched/SchedulerServiceImplTest.java | 4 ++-- .../resthook/SubscriptionTriggeringDstu3Test.java | 2 +- .../ca/uhn/fhir/jpa/model}/sched/IHapiScheduler.java | 2 +- .../uhn/fhir/jpa/model}/sched/ISchedulerService.java | 2 +- .../fhir/jpa/model/sched}/ISmartLifecyclePhase.java | 2 +- .../fhir/jpa/model}/sched/ScheduledJobDefinition.java | 2 +- .../searchparam/registry/SearchParamRegistryImpl.java | 4 ++-- .../registry/SearchParamRegistryImplTest.java | 2 +- .../subscription/module/cache/SubscriptionLoader.java | 4 ++-- .../module/config/TestSubscriptionDstu3Config.java | 2 +- .../uhn/fhirtest/interceptor/AnalyticsInterceptor.java | 4 ++-- 28 files changed, 55 insertions(+), 53 deletions(-) rename {hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server => hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model}/sched/IHapiScheduler.java (89%) rename {hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server => hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model}/sched/ISchedulerService.java (97%) rename {hapi-fhir-base/src/main/java/ca/uhn/fhir/model/api => hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched}/ISmartLifecyclePhase.java (90%) rename {hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server => hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model}/sched/ScheduledJobDefinition.java (97%) diff --git a/hapi-fhir-base/pom.xml b/hapi-fhir-base/pom.xml index 5d581c1b6be..1193fac9f34 100644 --- a/hapi-fhir-base/pom.xml +++ b/hapi-fhir-base/pom.xml @@ -115,11 +115,6 @@ logback-classic true - - - org.quartz-scheduler - quartz - org.awaitility diff --git a/hapi-fhir-jpaserver-base/pom.xml b/hapi-fhir-jpaserver-base/pom.xml index f8738174219..62b09103e5b 100644 --- a/hapi-fhir-jpaserver-base/pom.xml +++ b/hapi-fhir-jpaserver-base/pom.xml @@ -312,6 +312,13 @@ javax.servlet-api provided + + + org.quartz-scheduler + quartz + + + diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java index 379f5877e2e..b6967639c5c 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/BulkDataExportSvcImpl.java @@ -33,6 +33,8 @@ import ca.uhn.fhir.jpa.entity.BulkExportCollectionFileEntity; import ca.uhn.fhir.jpa.entity.BulkExportJobEntity; import ca.uhn.fhir.jpa.model.cross.ResourcePersistentId; import ca.uhn.fhir.jpa.model.sched.HapiJob; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.model.search.SearchRuntimeDetails; import ca.uhn.fhir.jpa.model.util.JpaConstants; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; @@ -43,8 +45,6 @@ import ca.uhn.fhir.rest.param.DateRangeParam; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.BinaryUtil; import ca.uhn.fhir.util.StopWatch; import org.apache.commons.io.FileUtils; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java index 61018d64fca..dbf0cdeac07 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java @@ -12,6 +12,7 @@ import ca.uhn.fhir.jpa.bulk.IBulkDataExportSvc; import ca.uhn.fhir.jpa.dao.DaoRegistry; import ca.uhn.fhir.jpa.graphql.JpaStorageServices; import ca.uhn.fhir.jpa.interceptor.JpaConsentContextServices; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; import ca.uhn.fhir.jpa.provider.SubscriptionTriggeringProvider; import ca.uhn.fhir.jpa.provider.TerminologyUploaderProvider; import ca.uhn.fhir.jpa.sched.AutowiringSpringBeanJobFactory; @@ -35,7 +36,6 @@ import ca.uhn.fhir.jpa.subscription.module.channel.ISubscribableChannelFactory; import ca.uhn.fhir.jpa.subscription.module.matcher.ISubscriptionMatcher; import ca.uhn.fhir.jpa.subscription.module.matcher.InMemorySubscriptionMatcher; import ca.uhn.fhir.rest.server.interceptor.consent.IConsentContextServices; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; import org.hibernate.jpa.HibernatePersistenceProvider; import org.hl7.fhir.utilities.graphql.IGraphQLStorageServices; import org.springframework.beans.factory.annotation.Autowired; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java index b08faf872aa..4b8fb746482 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java @@ -1,9 +1,9 @@ package ca.uhn.fhir.jpa.sched; import ca.uhn.fhir.context.ConfigurationException; +import ca.uhn.fhir.jpa.model.sched.IHapiScheduler; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; -import ca.uhn.fhir.rest.server.sched.IHapiScheduler; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import com.google.common.collect.Sets; import org.apache.commons.lang3.Validate; import org.quartz.*; @@ -70,7 +70,7 @@ public abstract class BaseHapiScheduler implements IHapiScheduler { try { myScheduler.start(); } catch (SchedulerException e) { - ourLog.error("Failed to start up scheduler"); + ourLog.error("Failed to start up scheduler", e); throw new ConfigurationException("Failed to start up scheduler", e); } } @@ -80,7 +80,7 @@ public abstract class BaseHapiScheduler implements IHapiScheduler { try { myScheduler.shutdown(true); } catch (SchedulerException e) { - ourLog.error("Failed to shut down scheduler"); + ourLog.error("Failed to shut down scheduler", e); throw new ConfigurationException("Failed to shut down scheduler", e); } } @@ -90,7 +90,7 @@ public abstract class BaseHapiScheduler implements IHapiScheduler { try { return myScheduler.isStarted(); } catch (SchedulerException e) { - ourLog.error("Failed to determine scheduler status"); + ourLog.error("Failed to determine scheduler status", e); return false; } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java index a96887bf93b..5b19abb16ce 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java @@ -21,10 +21,10 @@ package ca.uhn.fhir.jpa.sched; */ import ca.uhn.fhir.context.ConfigurationException; -import ca.uhn.fhir.model.api.ISmartLifecyclePhase; -import ca.uhn.fhir.rest.server.sched.IHapiScheduler; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; +import ca.uhn.fhir.jpa.model.sched.IHapiScheduler; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.sched.ISmartLifecyclePhase; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.StopWatch; import org.quartz.SchedulerException; import org.slf4j.Logger; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java index 672820e80d5..3bcd690c143 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java @@ -1,7 +1,7 @@ package ca.uhn.fhir.jpa.sched; -import ca.uhn.fhir.rest.server.sched.IHapiScheduler; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; +import ca.uhn.fhir.jpa.model.sched.IHapiScheduler; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import org.quartz.SchedulerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiSchedulerServiceImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiSchedulerServiceImpl.java index a0e8530c06e..124269d8f10 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiSchedulerServiceImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiSchedulerServiceImpl.java @@ -1,6 +1,6 @@ package ca.uhn.fhir.jpa.sched; -import ca.uhn.fhir.rest.server.sched.IHapiScheduler; +import ca.uhn.fhir.jpa.model.sched.IHapiScheduler; public class HapiSchedulerServiceImpl extends BaseSchedulerServiceImpl { public static final String THREAD_NAME_PREFIX = "hapi-fhir-jpa-scheduler"; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java index 72390b808f7..1f19823e2c6 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/StaleSearchDeletingSvcImpl.java @@ -22,9 +22,9 @@ package ca.uhn.fhir.jpa.search; import ca.uhn.fhir.jpa.dao.DaoConfig; import ca.uhn.fhir.jpa.model.sched.HapiJob; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.search.cache.ISearchCacheSvc; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import org.quartz.JobExecutionContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Propagation; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java index 4716a8e9aad..f9bdf94df79 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/cache/BaseSearchCacheSvcImpl.java @@ -22,8 +22,8 @@ package ca.uhn.fhir.jpa.search.cache; import ca.uhn.fhir.jpa.entity.Search; import ca.uhn.fhir.jpa.model.sched.HapiJob; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import org.apache.commons.lang3.time.DateUtils; import org.quartz.JobExecutionContext; import org.springframework.beans.factory.annotation.Autowired; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java index 98506cfae57..d26bcf28657 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java @@ -34,11 +34,11 @@ import ca.uhn.fhir.jpa.entity.ResourceReindexJobEntity; import ca.uhn.fhir.jpa.model.entity.ForcedId; import ca.uhn.fhir.jpa.model.entity.ResourceTable; import ca.uhn.fhir.jpa.model.sched.HapiJob; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.searchparam.registry.ISearchParamRegistry; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.ResourceVersionConflictException; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.StopWatch; import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang3.Validate; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java index f5b42d451e3..84c6df873c4 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/warm/CacheWarmingSvcImpl.java @@ -27,10 +27,10 @@ import ca.uhn.fhir.jpa.dao.DaoConfig; import ca.uhn.fhir.jpa.dao.DaoRegistry; import ca.uhn.fhir.jpa.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.model.sched.HapiJob; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.searchparam.MatchUrlService; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.UrlUtil; import org.apache.commons.lang3.time.DateUtils; import org.quartz.JobExecutionContext; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java index 7c77954356d..ab0d21cbdf7 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionTriggeringSvcImpl.java @@ -27,6 +27,8 @@ import ca.uhn.fhir.jpa.dao.DaoRegistry; import ca.uhn.fhir.jpa.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.model.cross.ResourcePersistentId; import ca.uhn.fhir.jpa.model.sched.HapiJob; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.provider.SubscriptionTriggeringProvider; import ca.uhn.fhir.jpa.search.ISearchCoordinatorSvc; import ca.uhn.fhir.jpa.searchparam.MatchUrlService; @@ -39,8 +41,6 @@ import ca.uhn.fhir.rest.api.server.IBundleProvider; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.ParametersUtil; import ca.uhn.fhir.util.StopWatch; import ca.uhn.fhir.util.UrlUtil; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java index d2e858e0226..ae2e55cb18e 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/BaseTermReadSvcImpl.java @@ -31,6 +31,8 @@ import ca.uhn.fhir.jpa.entity.TermConceptParentChildLink.RelationshipTypeEnum; import ca.uhn.fhir.jpa.model.cross.ResourcePersistentId; import ca.uhn.fhir.jpa.model.entity.ResourceTable; import ca.uhn.fhir.jpa.model.sched.HapiJob; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermDeferredStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermLoaderSvc; @@ -42,8 +44,6 @@ import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.StopWatch; import ca.uhn.fhir.util.UrlUtil; import ca.uhn.fhir.util.ValidateUtil; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java index 82ddfe5dc4d..f0a70b2e045 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermDeferredStorageSvcImpl.java @@ -26,11 +26,11 @@ import ca.uhn.fhir.jpa.dao.data.ITermConceptParentChildLinkDao; import ca.uhn.fhir.jpa.entity.TermConcept; import ca.uhn.fhir.jpa.entity.TermConceptParentChildLink; import ca.uhn.fhir.jpa.model.sched.HapiJob; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermDeferredStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermVersionAdapterSvc; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.StopWatch; import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang3.Validate; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java index 7fdafcbf7bc..9733c0cfc0b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/term/TermReindexingSvcImpl.java @@ -24,11 +24,11 @@ import ca.uhn.fhir.jpa.dao.data.ITermConceptDao; import ca.uhn.fhir.jpa.dao.data.ITermConceptParentChildLinkDao; import ca.uhn.fhir.jpa.entity.TermConcept; import ca.uhn.fhir.jpa.model.sched.HapiJob; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.term.api.ITermCodeSystemStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermDeferredStorageSvc; import ca.uhn.fhir.jpa.term.api.ITermReindexingSvc; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.StopWatch; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ArrayListMultimap; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java index 27ef82db650..c5cf0d82294 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/util/ResourceCountCache.java @@ -21,9 +21,9 @@ package ca.uhn.fhir.jpa.util; */ import ca.uhn.fhir.jpa.model.sched.HapiJob; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang3.time.DateUtils; import org.quartz.JobExecutionContext; diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java index dc4e2603d97..de008af9646 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/sched/SchedulerServiceImplTest.java @@ -1,8 +1,8 @@ package ca.uhn.fhir.jpa.sched; import ca.uhn.fhir.jpa.model.sched.HapiJob; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/subscription/resthook/SubscriptionTriggeringDstu3Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/subscription/resthook/SubscriptionTriggeringDstu3Test.java index 0fcffcc14ba..6d1d9169235 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/subscription/resthook/SubscriptionTriggeringDstu3Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/subscription/resthook/SubscriptionTriggeringDstu3Test.java @@ -2,6 +2,7 @@ package ca.uhn.fhir.jpa.subscription.resthook; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.jpa.dao.DaoConfig; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; import ca.uhn.fhir.jpa.model.util.JpaConstants; import ca.uhn.fhir.jpa.provider.SubscriptionTriggeringProvider; import ca.uhn.fhir.jpa.provider.dstu3.BaseResourceProviderDstu3Test; @@ -15,7 +16,6 @@ import ca.uhn.fhir.rest.api.MethodOutcome; import ca.uhn.fhir.rest.server.IResourceProvider; import ca.uhn.fhir.rest.server.RestfulServer; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; import ca.uhn.fhir.test.utilities.JettyUtil; import com.google.common.collect.Lists; import org.eclipse.jetty.server.Server; diff --git a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/IHapiScheduler.java b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/IHapiScheduler.java similarity index 89% rename from hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/IHapiScheduler.java rename to hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/IHapiScheduler.java index 6caca26282e..a6a32c42f06 100644 --- a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/IHapiScheduler.java +++ b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/IHapiScheduler.java @@ -1,4 +1,4 @@ -package ca.uhn.fhir.rest.server.sched; +package ca.uhn.fhir.jpa.model.sched; import org.quartz.SchedulerException; diff --git a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerService.java b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISchedulerService.java similarity index 97% rename from hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerService.java rename to hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISchedulerService.java index 41982565053..f8623d3ea33 100644 --- a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ISchedulerService.java +++ b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISchedulerService.java @@ -1,4 +1,4 @@ -package ca.uhn.fhir.rest.server.sched; +package ca.uhn.fhir.jpa.model.sched; /*- * #%L diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/api/ISmartLifecyclePhase.java b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISmartLifecyclePhase.java similarity index 90% rename from hapi-fhir-base/src/main/java/ca/uhn/fhir/model/api/ISmartLifecyclePhase.java rename to hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISmartLifecyclePhase.java index 00fd2b60510..51b58964c10 100644 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/api/ISmartLifecyclePhase.java +++ b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISmartLifecyclePhase.java @@ -1,4 +1,4 @@ -package ca.uhn.fhir.model.api; +package ca.uhn.fhir.jpa.model.sched; public interface ISmartLifecyclePhase { // POST_CONSTRUCT is here as a marker for where post-construct fits into the smart lifecycle. Beans with negative phases diff --git a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ScheduledJobDefinition.java b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ScheduledJobDefinition.java similarity index 97% rename from hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ScheduledJobDefinition.java rename to hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ScheduledJobDefinition.java index bf3f35510c4..caa28b0ab32 100644 --- a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/sched/ScheduledJobDefinition.java +++ b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ScheduledJobDefinition.java @@ -1,4 +1,4 @@ -package ca.uhn.fhir.rest.server.sched; +package ca.uhn.fhir.jpa.model.sched; /*- * #%L diff --git a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java index 8926a84495f..78f55680b37 100644 --- a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java +++ b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImpl.java @@ -28,6 +28,8 @@ import ca.uhn.fhir.interceptor.api.IInterceptorBroadcaster; import ca.uhn.fhir.interceptor.api.Pointcut; import ca.uhn.fhir.jpa.model.entity.ModelConfig; import ca.uhn.fhir.jpa.model.sched.HapiJob; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.model.search.StorageProcessingMessage; import ca.uhn.fhir.jpa.searchparam.JpaRuntimeSearchParam; import ca.uhn.fhir.jpa.searchparam.SearchParamConstants; @@ -37,8 +39,6 @@ import ca.uhn.fhir.model.api.ExtensionDt; import ca.uhn.fhir.rest.api.RestSearchParameterTypeEnum; import ca.uhn.fhir.rest.api.server.IBundleProvider; import ca.uhn.fhir.rest.api.server.RequestDetails; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails; import ca.uhn.fhir.util.DatatypeUtil; import ca.uhn.fhir.util.SearchParameterUtil; diff --git a/hapi-fhir-jpaserver-searchparam/src/test/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImplTest.java b/hapi-fhir-jpaserver-searchparam/src/test/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImplTest.java index 6b42e5f8c27..c9b8f817b50 100644 --- a/hapi-fhir-jpaserver-searchparam/src/test/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImplTest.java +++ b/hapi-fhir-jpaserver-searchparam/src/test/java/ca/uhn/fhir/jpa/searchparam/registry/SearchParamRegistryImplTest.java @@ -2,9 +2,9 @@ package ca.uhn.fhir.jpa.searchparam.registry; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.RuntimeSearchParam; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; import ca.uhn.fhir.rest.server.SimpleBundleProvider; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; import org.hamcrest.Matchers; import org.hl7.fhir.instance.model.api.IPrimitiveType; import org.hl7.fhir.r4.model.Enumerations; diff --git a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java index 1b3144a91f4..a575df4bb3d 100644 --- a/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java +++ b/hapi-fhir-jpaserver-subscription/src/main/java/ca/uhn/fhir/jpa/subscription/module/cache/SubscriptionLoader.java @@ -22,13 +22,13 @@ package ca.uhn.fhir.jpa.subscription.module.cache; import ca.uhn.fhir.jpa.api.IDaoRegistry; import ca.uhn.fhir.jpa.model.sched.HapiJob; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; import ca.uhn.fhir.jpa.searchparam.retry.Retrier; import ca.uhn.fhir.rest.api.server.IBundleProvider; import ca.uhn.fhir.rest.param.TokenOrListParam; import ca.uhn.fhir.rest.param.TokenParam; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang3.time.DateUtils; import org.hl7.fhir.instance.model.api.IBaseResource; diff --git a/hapi-fhir-jpaserver-subscription/src/test/java/ca/uhn/fhir/jpa/subscription/module/config/TestSubscriptionDstu3Config.java b/hapi-fhir-jpaserver-subscription/src/test/java/ca/uhn/fhir/jpa/subscription/module/config/TestSubscriptionDstu3Config.java index 0a09fe40757..bd833138922 100644 --- a/hapi-fhir-jpaserver-subscription/src/test/java/ca/uhn/fhir/jpa/subscription/module/config/TestSubscriptionDstu3Config.java +++ b/hapi-fhir-jpaserver-subscription/src/test/java/ca/uhn/fhir/jpa/subscription/module/config/TestSubscriptionDstu3Config.java @@ -1,9 +1,9 @@ package ca.uhn.fhir.jpa.subscription.module.config; import ca.uhn.fhir.jpa.api.IDaoRegistry; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; import ca.uhn.fhir.jpa.searchparam.registry.ISearchParamProvider; import ca.uhn.fhir.jpa.subscription.module.cache.ISubscriptionProvider; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; diff --git a/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java b/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java index ca950f33160..ddc5687d799 100644 --- a/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java +++ b/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/interceptor/AnalyticsInterceptor.java @@ -1,11 +1,11 @@ package ca.uhn.fhirtest.interceptor; import ca.uhn.fhir.jpa.model.sched.HapiJob; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; +import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.rest.api.RestOperationTypeEnum; import ca.uhn.fhir.rest.client.apache.ApacheRestfulClientFactory; import ca.uhn.fhir.rest.server.interceptor.InterceptorAdapter; -import ca.uhn.fhir.rest.server.sched.ISchedulerService; -import ca.uhn.fhir.rest.server.sched.ScheduledJobDefinition; import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails; import ca.uhn.fhir.util.UrlUtil; import org.apache.http.client.HttpClient; From f29118fa9c7ca85340d6155ec0b70f4183bf0803 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Mon, 2 Dec 2019 14:32:34 -0500 Subject: [PATCH 20/34] move clustered quartz from cm db to pers db --- .../fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java | 7 ++++++- .../src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java | 3 --- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java index 00079474305..53fde91e047 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java @@ -55,7 +55,12 @@ public class HapiFhirJpaMigrationTasks extends BaseMigrationTasks { init350(); // 20180601 - 20180917 init360(); // 20180918 - 20181112 init400(); // 20190401 - 20190814 - init410(); // 20190815 - present + init410(); // 20190815 - 20191014 + init420(); // 20191015 - present + } + + protected void init420() { // 20191015 - present + Builder version = forVersion(VersionEnum.V4_2_0); } protected void init410() { // 20190815 - present diff --git a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java index 8135c710a37..a901b648eb3 100644 --- a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java +++ b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/HapiJob.java @@ -22,10 +22,7 @@ package ca.uhn.fhir.jpa.model.sched; import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; -import org.quartz.PersistJobDataAfterExecution; @DisallowConcurrentExecution -// TODO KHS do we still need this? -@PersistJobDataAfterExecution public interface HapiJob extends Job { } From c27dfdff5131b68315decdb2eb2ad3a085342f41 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Mon, 2 Dec 2019 18:48:40 -0500 Subject: [PATCH 21/34] back out schema initialize naming. there may be migrated schemas in the wild this would interfere with. --- .../fhir/jpa/migrate/taskdef/InitializeSchemaTask.java | 2 +- .../jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java | 2 +- .../migrate/tasks/SchemaInitializationProvider.java | 10 +--------- .../tasks/api/ISchemaInitializationProvider.java | 2 -- .../jpa/migrate/taskdef/InitializeSchemaTaskTest.java | 5 ----- 5 files changed, 3 insertions(+), 18 deletions(-) diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTask.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTask.java index 4ab392d1c6a..7365bd37a8d 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTask.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTask.java @@ -39,7 +39,7 @@ public class InitializeSchemaTask extends BaseTask { public InitializeSchemaTask(String theProductVersion, String theSchemaVersion, ISchemaInitializationProvider theSchemaInitializationProvider) { super(theProductVersion, theSchemaVersion); mySchemaInitializationProvider = theSchemaInitializationProvider; - setDescription("Initialize schema for " + theSchemaInitializationProvider.getDescription()); + setDescription("Initialize schema"); } @Override diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java index 53fde91e047..3dde8244db4 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/HapiFhirJpaMigrationTasks.java @@ -885,7 +885,7 @@ public class HapiFhirJpaMigrationTasks extends BaseMigrationTasks { private void init330() { // 20180114 - 20180329 Builder version = forVersion(VersionEnum.V3_3_0); - version.initializeSchema("20180115.0", new SchemaInitializationProvider("HAPI-FHIR", "/ca/uhn/hapi/fhir/jpa/docs/database", "HFJ_RESOURCE")); + version.initializeSchema("20180115.0", new SchemaInitializationProvider("/ca/uhn/hapi/fhir/jpa/docs/database", "HFJ_RESOURCE")); Builder.BuilderWithTableName hfjResource = version.onTable("HFJ_RESOURCE"); version.startSectionWithMessage("Starting work on table: " + hfjResource.getTableName()); diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java index ae5bd36f785..6472bae0f33 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java @@ -38,17 +38,14 @@ import java.util.regex.Pattern; import static org.apache.commons.lang3.StringUtils.isBlank; public class SchemaInitializationProvider implements ISchemaInitializationProvider { - private final String mySchemaDescription; private final String mySchemaFileClassPath; private final String mySchemaExistsIndicatorTable; /** - * @param theSchemaDescription description of the schema being updated (for logging) * @param theSchemaFileClassPath pathname to script used to initialize schema * @param theSchemaExistsIndicatorTable a table name we can use to determine if this schema has already been initialized */ - public SchemaInitializationProvider(String theSchemaDescription, String theSchemaFileClassPath, String theSchemaExistsIndicatorTable) { - mySchemaDescription = theSchemaDescription; + public SchemaInitializationProvider(String theSchemaFileClassPath, String theSchemaExistsIndicatorTable) { mySchemaFileClassPath = theSchemaFileClassPath; mySchemaExistsIndicatorTable = theSchemaExistsIndicatorTable; } @@ -85,11 +82,6 @@ public class SchemaInitializationProvider implements ISchemaInitializationProvid return matcher.replaceAll("$1\\)"); } - @Override - public String getDescription() { - return mySchemaDescription; - } - @Nonnull protected String getInitScript(DriverTypeEnum theDriverType) { return theDriverType.getSchemaFilename(); diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/ISchemaInitializationProvider.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/ISchemaInitializationProvider.java index edb855a5bfd..1dd3a8370cf 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/ISchemaInitializationProvider.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/ISchemaInitializationProvider.java @@ -28,6 +28,4 @@ public interface ISchemaInitializationProvider { List getSqlStatements(DriverTypeEnum theDriverType); String getSchemaExistsIndicatorTable(); - - String getDescription(); } diff --git a/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTaskTest.java b/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTaskTest.java index 9d96ea4aaa8..a55cd045f9d 100644 --- a/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTaskTest.java +++ b/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/taskdef/InitializeSchemaTaskTest.java @@ -40,11 +40,6 @@ public class InitializeSchemaTaskTest extends BaseTest { return "DONT_MATCH_ME"; } - @Override - public String getDescription() { - return "test"; - } - @Override public boolean equals(Object theO) { if (this == theO) return true; From e0a2b9a179e3fc10fb27eb8283e4f554633c288f Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Mon, 2 Dec 2019 19:02:04 -0500 Subject: [PATCH 22/34] support schema initialize naming in a backwards compatible way --- .../java/ca/uhn/fhir/jpa/migrate/tasks/api/Builder.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/Builder.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/Builder.java index 42e0b2a9549..af5a782889e 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/Builder.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/Builder.java @@ -57,6 +57,13 @@ public class Builder { return this; } + public Builder initializeSchema(String theVersion, String theSchemaName, ISchemaInitializationProvider theSchemaInitializationProvider) { + InitializeSchemaTask task = new InitializeSchemaTask(myRelease, theVersion, theSchemaInitializationProvider); + task.setDescription("Initialize " + theSchemaName + " schema"); + mySink.addTask(task); + return this; + } + public Builder executeRawSql(String theVersion, DriverTypeEnum theDriver, @Language("SQL") String theSql) { mySink.addTask(new ExecuteRawSqlTask(myRelease, theVersion).addSql(theDriver, theSql)); return this; From 09d2599ce5ef08e837b88df0fb98a97f7e856249 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Tue, 3 Dec 2019 16:01:52 -0500 Subject: [PATCH 23/34] fix test --- .../jpa/search/reindex/ResourceReindexingSvcImpl.java | 5 +++++ .../search/reindex/ResourceReindexingSvcImplTest.java | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java index d26bcf28657..deb7ab62ef1 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java @@ -142,6 +142,11 @@ public class ResourceReindexingSvcImpl implements IResourceReindexingSvc { myContext = theContext; } + @VisibleForTesting + void setSchedulerServiceForUnitTest(ISchedulerService theSchedulerService) { + mySchedulerService = theSchedulerService; + } + @PostConstruct public void start() { myTxTemplate = new TransactionTemplate(myTxManager); diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImplTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImplTest.java index df545aa87fe..626957b7a3d 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImplTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImplTest.java @@ -1,16 +1,13 @@ package ca.uhn.fhir.jpa.search.reindex; import ca.uhn.fhir.context.FhirContext; -import ca.uhn.fhir.jpa.dao.BaseHapiFhirDao; -import ca.uhn.fhir.jpa.dao.BaseJpaTest; -import ca.uhn.fhir.jpa.dao.DaoConfig; -import ca.uhn.fhir.jpa.dao.DaoRegistry; -import ca.uhn.fhir.jpa.dao.IFhirResourceDao; +import ca.uhn.fhir.jpa.dao.*; import ca.uhn.fhir.jpa.dao.data.IForcedIdDao; import ca.uhn.fhir.jpa.dao.data.IResourceReindexJobDao; import ca.uhn.fhir.jpa.dao.data.IResourceTableDao; import ca.uhn.fhir.jpa.entity.ResourceReindexJobEntity; import ca.uhn.fhir.jpa.model.entity.ResourceTable; +import ca.uhn.fhir.jpa.model.sched.ISchedulerService; import ca.uhn.fhir.jpa.searchparam.registry.ISearchParamRegistry; import org.apache.commons.lang3.time.DateUtils; import org.hl7.fhir.instance.model.api.IBaseResource; @@ -72,6 +69,8 @@ public class ResourceReindexingSvcImplTest extends BaseJpaTest { private ISearchParamRegistry mySearchParamRegistry; @Mock private TransactionStatus myTxStatus; + @Mock + private ISchedulerService mySchedulerService; @Override protected FhirContext getContext() { @@ -97,6 +96,7 @@ public class ResourceReindexingSvcImplTest extends BaseJpaTest { mySvc.setResourceTableDaoForUnitTest(myResourceTableDao); mySvc.setTxManagerForUnitTest(myTxManager); mySvc.setSearchParamRegistryForUnitTest(mySearchParamRegistry); + mySvc.setSchedulerServiceForUnitTest(mySchedulerService); mySvc.start(); when(myTxManager.getTransaction(any())).thenReturn(myTxStatus); From b171ff97eaf213145566daa9c665b5d107211e03 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Tue, 3 Dec 2019 22:02:00 -0500 Subject: [PATCH 24/34] improve logging --- .../ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java index 4b8fb746482..31792385e84 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java @@ -6,6 +6,7 @@ import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import com.google.common.collect.Sets; import org.apache.commons.lang3.Validate; +import org.jetbrains.annotations.NotNull; import org.quartz.*; import org.quartz.impl.JobDetailImpl; import org.quartz.impl.StdSchedulerFactory; @@ -31,6 +32,7 @@ public abstract class BaseHapiScheduler implements IHapiScheduler { private final Properties myProperties = new Properties(); private Scheduler myScheduler; + private String myInstanceName; public BaseHapiScheduler(String theThreadNamePrefix, AutowiringSpringBeanJobFactory theSpringBeanJobFactory) { myThreadNamePrefix = theThreadNamePrefix; @@ -38,8 +40,8 @@ public abstract class BaseHapiScheduler implements IHapiScheduler { } - void setInstanceName(String theName) { - myProperties.setProperty(PROP_SCHED_INSTANCE_NAME, theName + "-" + nextSchedulerId()); + void setInstanceName(String theInstanceName) { + myInstanceName = theInstanceName; } @@ -58,7 +60,13 @@ public abstract class BaseHapiScheduler implements IHapiScheduler { protected void setProperties() { addProperty("org.quartz.threadPool.threadCount", "4"); - addProperty("org.quartz.threadPool.threadNamePrefix", myThreadNamePrefix + "-" + myProperties.get(PROP_SCHED_INSTANCE_NAME)); + myProperties.setProperty(PROP_SCHED_INSTANCE_NAME, myInstanceName + "-" + nextSchedulerId()); + addProperty("org.quartz.threadPool.threadNamePrefix", getThreadPrefix()); + } + + @NotNull + private String getThreadPrefix() { + return myThreadNamePrefix + "-" + myInstanceName; } protected void addProperty(String key, String value) { @@ -68,6 +76,7 @@ public abstract class BaseHapiScheduler implements IHapiScheduler { @Override public void start() { try { + ourLog.info("Starting scheduler {}", getThreadPrefix()); myScheduler.start(); } catch (SchedulerException e) { ourLog.error("Failed to start up scheduler", e); From 2f89f10c641cc538e36cdfd22e6b42310b4e3dee Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Wed, 4 Dec 2019 17:23:51 -0500 Subject: [PATCH 25/34] allow users to set default group --- .../ca/uhn/fhir/jpa/config/BaseConfig.java | 3 +- .../uhn/fhir/jpa/sched/BaseHapiScheduler.java | 12 +++++-- .../jpa/sched/BaseSchedulerServiceImpl.java | 36 ++++++++++++++++--- .../uhn/fhir/jpa/sched/HapiNullScheduler.java | 8 +++++ .../fhir/jpa/model/sched/IHapiScheduler.java | 5 +++ .../jpa/model/sched/ISchedulerService.java | 9 +++++ .../model/sched/ScheduledJobDefinition.java | 22 ++++++++++-- 7 files changed, 86 insertions(+), 9 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java index dbf0cdeac07..759983d09ba 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/BaseConfig.java @@ -83,6 +83,7 @@ public abstract class BaseConfig { public static final String TASK_EXECUTOR_NAME = "hapiJpaTaskExecutor"; public static final String GRAPHQL_PROVIDER_NAME = "myGraphQLProvider"; + private static final String HAPI_DEFAULT_SCHEDULER_GROUP = "HAPI"; @Autowired protected Environment myEnv; @@ -249,7 +250,7 @@ public abstract class BaseConfig { @Bean public ISchedulerService schedulerService() { - return new HapiSchedulerServiceImpl(); + return new HapiSchedulerServiceImpl().setDefaultGroup(HAPI_DEFAULT_SCHEDULER_GROUP); } @Bean diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java index 31792385e84..85f6373e90f 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java @@ -4,6 +4,7 @@ import ca.uhn.fhir.context.ConfigurationException; import ca.uhn.fhir.jpa.model.sched.IHapiScheduler; import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Sets; import org.apache.commons.lang3.Validate; import org.jetbrains.annotations.NotNull; @@ -129,12 +130,13 @@ public abstract class BaseHapiScheduler implements IHapiScheduler { Validate.notNull(theJobDefinition.getJobClass()); Validate.notBlank(theJobDefinition.getId()); - JobKey jobKey = new JobKey(theJobDefinition.getId()); + JobKey jobKey; + + jobKey = new JobKey(theJobDefinition.getId(), theJobDefinition.getGroup()); JobDetailImpl jobDetail = new NonConcurrentJobDetailImpl(); jobDetail.setJobClass(theJobDefinition.getJobClass()); jobDetail.setKey(jobKey); - jobDetail.setName(theJobDefinition.getId()); jobDetail.setJobDataMap(new JobDataMap(theJobDefinition.getJobData())); ScheduleBuilder schedule = SimpleScheduleBuilder @@ -158,6 +160,12 @@ public abstract class BaseHapiScheduler implements IHapiScheduler { } + @VisibleForTesting + @Override + public Set getJobKeysForUnitTest() throws SchedulerException { + return myScheduler.getJobKeys(GroupMatcher.anyGroup()); + } + private static class NonConcurrentJobDetailImpl extends JobDetailImpl { private static final long serialVersionUID = 5716197221121989740L; diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java index 5b19abb16ce..5721134e0fc 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java @@ -26,6 +26,8 @@ import ca.uhn.fhir.jpa.model.sched.ISchedulerService; import ca.uhn.fhir.jpa.model.sched.ISmartLifecyclePhase; import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; import ca.uhn.fhir.util.StopWatch; +import com.google.common.annotations.VisibleForTesting; +import org.quartz.JobKey; import org.quartz.SchedulerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,6 +37,7 @@ import org.springframework.context.SmartLifecycle; import org.springframework.core.env.Environment; import javax.annotation.PostConstruct; +import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; /** @@ -65,6 +68,8 @@ public abstract class BaseSchedulerServiceImpl implements ISchedulerService, Sma private boolean myClusteredSchedulingEnabled; private AtomicBoolean myStopping = new AtomicBoolean(false); + private String myDefaultGroup; + @Autowired private Environment myEnvironment; @Autowired @@ -77,6 +82,11 @@ public abstract class BaseSchedulerServiceImpl implements ISchedulerService, Sma setClusteredSchedulingEnabled(true); } + public BaseSchedulerServiceImpl setDefaultGroup(String theDefaultGroup) { + myDefaultGroup = theDefaultGroup; + return this; + } + public boolean isLocalSchedulingEnabled() { return myLocalSchedulingEnabled; } @@ -174,14 +184,32 @@ public abstract class BaseSchedulerServiceImpl implements ISchedulerService, Sma @Override public void scheduleLocalJob(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { - ourLog.info("Scheduling local job {} with interval {}", theJobDefinition.getId(), StopWatch.formatMillis(theIntervalMillis)); - myLocalScheduler.scheduleJob(theIntervalMillis, theJobDefinition); + scheduleJob("local", myLocalScheduler, theIntervalMillis, theJobDefinition); } @Override public void scheduleClusteredJob(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { - ourLog.info("Scheduling clustered job {} with interval {}", theJobDefinition.getId(), StopWatch.formatMillis(theIntervalMillis)); - myClusteredScheduler.scheduleJob(theIntervalMillis, theJobDefinition); + scheduleJob("clustered", myClusteredScheduler, theIntervalMillis, theJobDefinition); + } + + private void scheduleJob(String theInstanceName, IHapiScheduler theScheduler, long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { + ourLog.info("Scheduling {} job {} with interval {}", theInstanceName, theJobDefinition.getId(), StopWatch.formatMillis(theIntervalMillis)); + if (theJobDefinition.getGroup() == null) { + theJobDefinition.setGroup(myDefaultGroup); + } + theScheduler.scheduleJob(theIntervalMillis, theJobDefinition); + } + + @VisibleForTesting + @Override + public Set getLocalJobKeysForUnitTest() throws SchedulerException { + return myLocalScheduler.getJobKeysForUnitTest(); + } + + @VisibleForTesting + @Override + public Set getClusteredJobKeysForUnitTest() throws SchedulerException { + return myClusteredScheduler.getJobKeysForUnitTest(); } private boolean isSchedulingDisabledForUnitTests() { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java index 3bcd690c143..42bc1571137 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/HapiNullScheduler.java @@ -2,10 +2,13 @@ package ca.uhn.fhir.jpa.sched; import ca.uhn.fhir.jpa.model.sched.IHapiScheduler; import ca.uhn.fhir.jpa.model.sched.ScheduledJobDefinition; +import org.quartz.JobKey; import org.quartz.SchedulerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Set; + public class HapiNullScheduler implements IHapiScheduler { private static final Logger ourLog = LoggerFactory.getLogger(HapiNullScheduler.class); @@ -43,4 +46,9 @@ public class HapiNullScheduler implements IHapiScheduler { public void scheduleJob(long theIntervalMillis, ScheduledJobDefinition theJobDefinition) { ourLog.debug("Skipping scheduling job {} since scheduling is disabled", theJobDefinition.getId()); } + + @Override + public Set getJobKeysForUnitTest() { + return null; + } } diff --git a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/IHapiScheduler.java b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/IHapiScheduler.java index a6a32c42f06..4ce9351369d 100644 --- a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/IHapiScheduler.java +++ b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/IHapiScheduler.java @@ -1,7 +1,10 @@ package ca.uhn.fhir.jpa.model.sched; +import org.quartz.JobKey; import org.quartz.SchedulerException; +import java.util.Set; + public interface IHapiScheduler { void init() throws SchedulerException; @@ -16,4 +19,6 @@ public interface IHapiScheduler { void logStatusForUnitTest(); void scheduleJob(long theIntervalMillis, ScheduledJobDefinition theJobDefinition); + + Set getJobKeysForUnitTest() throws SchedulerException; } diff --git a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISchedulerService.java b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISchedulerService.java index f8623d3ea33..656305483f3 100644 --- a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISchedulerService.java +++ b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ISchedulerService.java @@ -21,8 +21,11 @@ package ca.uhn.fhir.jpa.model.sched; */ import com.google.common.annotations.VisibleForTesting; +import org.quartz.JobKey; import org.quartz.SchedulerException; +import java.util.Set; + public interface ISchedulerService { @VisibleForTesting @@ -44,5 +47,11 @@ public interface ISchedulerService { */ void scheduleClusteredJob(long theIntervalMillis, ScheduledJobDefinition theJobDefinition); + @VisibleForTesting + Set getLocalJobKeysForUnitTest() throws SchedulerException; + + @VisibleForTesting + Set getClusteredJobKeysForUnitTest() throws SchedulerException; + boolean isStopping(); } diff --git a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ScheduledJobDefinition.java b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ScheduledJobDefinition.java index caa28b0ab32..245dec8721b 100644 --- a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ScheduledJobDefinition.java +++ b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/sched/ScheduledJobDefinition.java @@ -21,6 +21,7 @@ package ca.uhn.fhir.jpa.model.sched; */ import org.apache.commons.lang3.Validate; +import org.apache.commons.lang3.builder.ToStringBuilder; import org.quartz.Job; import java.util.Collections; @@ -28,10 +29,9 @@ import java.util.HashMap; import java.util.Map; public class ScheduledJobDefinition { - - private Class myJobClass; private String myId; + private String myGroup; private Map myJobData; public Map getJobData() { @@ -60,6 +60,15 @@ public class ScheduledJobDefinition { return this; } + public String getGroup() { + return myGroup; + } + + public ScheduledJobDefinition setGroup(String theGroup) { + myGroup = theGroup; + return this; + } + public void addJobData(String thePropertyName, String thePropertyValue) { Validate.notBlank(thePropertyName); if (myJobData == null) { @@ -68,4 +77,13 @@ public class ScheduledJobDefinition { Validate.isTrue(myJobData.containsKey(thePropertyName) == false); myJobData.put(thePropertyName, thePropertyValue); } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("myJobClass", myJobClass) + .append("myId", myId) + .append("myGroup", myGroup) + .toString(); + } } From c516ab8a753645523f558e55544bfd3d38b7ae33 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Wed, 4 Dec 2019 18:02:10 -0500 Subject: [PATCH 26/34] fake change --- .../java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java index 5721134e0fc..a570018ecfa 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java @@ -67,7 +67,6 @@ public abstract class BaseSchedulerServiceImpl implements ISchedulerService, Sma private boolean myLocalSchedulingEnabled; private boolean myClusteredSchedulingEnabled; private AtomicBoolean myStopping = new AtomicBoolean(false); - private String myDefaultGroup; @Autowired From 676a443cf2d52925aa4374339f588e737f720039 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Wed, 4 Dec 2019 21:20:09 -0500 Subject: [PATCH 27/34] NPEs --- .../java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java index 85f6373e90f..418e9b8d050 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseHapiScheduler.java @@ -76,6 +76,9 @@ public abstract class BaseHapiScheduler implements IHapiScheduler { @Override public void start() { + if (myScheduler == null) { + throw new ConfigurationException("Attempt to start uninitialized scheduler"); + } try { ourLog.info("Starting scheduler {}", getThreadPrefix()); myScheduler.start(); @@ -87,6 +90,9 @@ public abstract class BaseHapiScheduler implements IHapiScheduler { @Override public void shutdown() { + if (myScheduler == null) { + return; + } try { myScheduler.shutdown(true); } catch (SchedulerException e) { @@ -98,7 +104,7 @@ public abstract class BaseHapiScheduler implements IHapiScheduler { @Override public boolean isStarted() { try { - return myScheduler.isStarted(); + return myScheduler != null && myScheduler.isStarted(); } catch (SchedulerException e) { ourLog.error("Failed to determine scheduler status", e); return false; From 334daddf339b34ab6fad3aeb5b345d7caceebd6f Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Thu, 5 Dec 2019 10:32:53 -0500 Subject: [PATCH 28/34] fake change to trigger CI --- .../ca/uhn/fhir/jpa/search/SearchCoordinatorSvcImplTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/search/SearchCoordinatorSvcImplTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/search/SearchCoordinatorSvcImplTest.java index fe7ba6a3511..1cda0bacc2b 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/search/SearchCoordinatorSvcImplTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/search/SearchCoordinatorSvcImplTest.java @@ -19,7 +19,6 @@ import ca.uhn.fhir.rest.param.StringParam; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.ResourceGoneException; import ca.uhn.fhir.util.TestUtil; -import org.apache.commons.lang3.Validate; import org.hl7.fhir.instance.model.api.IBaseResource; import org.junit.After; import org.junit.AfterClass; @@ -157,6 +156,7 @@ public class SearchCoordinatorSvcImplTest { } + // TODO INTERMITTENT this test fails intermittently @Test public void testAsyncSearchLargeResultSetBigCountSameCoordinator() { List allResults = new ArrayList<>(); From a939dab894edeef5bbea30b07fac81fb8f0fb572 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Thu, 5 Dec 2019 11:53:41 -0500 Subject: [PATCH 29/34] fake change to trigger CI --- .../java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java index a570018ecfa..77da433d765 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/sched/BaseSchedulerServiceImpl.java @@ -111,6 +111,7 @@ public abstract class BaseSchedulerServiceImpl implements ISchedulerService, Sma private IHapiScheduler createScheduler(boolean theClustered) throws SchedulerException { if (!isLocalSchedulingEnabled() || isSchedulingDisabledForUnitTests()) { + ourLog.info("Scheduling is disabled on this server"); return new HapiNullScheduler(); } IHapiScheduler retval; From 1ce5dca5db218b3f6fb8322868675719da80f8b5 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Thu, 5 Dec 2019 15:32:53 -0500 Subject: [PATCH 30/34] intermittent failure? --- .../ca/uhn/fhir/cli/HapiFlywayMigrateDatabaseCommandTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/hapi-fhir-cli/hapi-fhir-cli-api/src/test/java/ca/uhn/fhir/cli/HapiFlywayMigrateDatabaseCommandTest.java b/hapi-fhir-cli/hapi-fhir-cli-api/src/test/java/ca/uhn/fhir/cli/HapiFlywayMigrateDatabaseCommandTest.java index cdb552f032b..7da2c97911b 100644 --- a/hapi-fhir-cli/hapi-fhir-cli-api/src/test/java/ca/uhn/fhir/cli/HapiFlywayMigrateDatabaseCommandTest.java +++ b/hapi-fhir-cli/hapi-fhir-cli-api/src/test/java/ca/uhn/fhir/cli/HapiFlywayMigrateDatabaseCommandTest.java @@ -37,6 +37,7 @@ public class HapiFlywayMigrateDatabaseCommandTest { System.setProperty("test", "true"); } + // TODO INTERMITTENT This just failed for me on CI with a BadSqlGrammarException @Test public void testMigrateFrom340() throws IOException, SQLException { From da5034959bb221c120691c2a3dcc716fb7cd0456 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Wed, 11 Dec 2019 13:41:27 -0500 Subject: [PATCH 31/34] start working on quartz fix --- .../fhir/jpa/migrate/tasks/SchemaInitializationProvider.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java index 6472bae0f33..36c992e1493 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java @@ -61,7 +61,9 @@ public class SchemaInitializationProvider implements ISchemaInitializationProvid throw new ConfigurationException("Schema initialization script " + initScript + " not found on classpath"); } // Assumes no escaped semicolons... - String[] statements = IOUtils.toString(sqlFileInputStream, Charsets.UTF_8).split("\\;"); + String sqlString = IOUtils.toString(sqlFileInputStream, Charsets.UTF_8); + String sqlStringNoComments = stripComments(sqlString); + String[] statements = sqlStringNoComments.split("\\;"); for (String statement : statements) { String cleanedStatement = clean(statement); if (!isBlank(cleanedStatement)) { From 7c1544d8f30e931a1bd35f9dc0c520524c91988f Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Wed, 11 Dec 2019 14:02:24 -0500 Subject: [PATCH 32/34] strip comments from sql before splitting ; (to avoid ; in comments) --- .../fhir/cli/BaseFlywayMigrateDatabaseCommand.java | 8 -------- .../migrate/tasks/SchemaInitializationProvider.java | 5 +++++ .../tasks/SchemaInitializationProviderTest.java | 11 +++++++++++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/hapi-fhir-cli/hapi-fhir-cli-api/src/main/java/ca/uhn/fhir/cli/BaseFlywayMigrateDatabaseCommand.java b/hapi-fhir-cli/hapi-fhir-cli-api/src/main/java/ca/uhn/fhir/cli/BaseFlywayMigrateDatabaseCommand.java index ed63bc26c0b..e177895baa4 100644 --- a/hapi-fhir-cli/hapi-fhir-cli-api/src/main/java/ca/uhn/fhir/cli/BaseFlywayMigrateDatabaseCommand.java +++ b/hapi-fhir-cli/hapi-fhir-cli-api/src/main/java/ca/uhn/fhir/cli/BaseFlywayMigrateDatabaseCommand.java @@ -30,7 +30,6 @@ import org.apache.commons.cli.ParseException; import org.apache.commons.lang3.StringUtils; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -68,13 +67,6 @@ public abstract class BaseFlywayMigrateDatabaseCommand extends B return MIGRATE_DATABASE; } - @Override - public List provideUsageNotes() { - String versions = "The following versions are supported: " + - provideAllowedVersions().stream().map(Enum::name).collect(Collectors.joining(", ")); - return Collections.singletonList(versions); - } - @Override public Options getOptions() { Options retVal = new Options(); diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java index 36c992e1493..97a9efda396 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java @@ -38,6 +38,7 @@ import java.util.regex.Pattern; import static org.apache.commons.lang3.StringUtils.isBlank; public class SchemaInitializationProvider implements ISchemaInitializationProvider { + private static final Pattern ourSqlCommentPattern = Pattern.compile("(?m)^\\s*--.*$"); private final String mySchemaFileClassPath; private final String mySchemaExistsIndicatorTable; @@ -76,6 +77,10 @@ public class SchemaInitializationProvider implements ISchemaInitializationProvid return retval; } + static String stripComments(String theSqlString) { + return ourSqlCommentPattern.matcher(theSqlString).replaceAll(""); + } + private static final Pattern ourTrailingCommaPattern = Pattern.compile(",(\\s+)\\)"); static String clean(String theStatement) { diff --git a/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java b/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java index 3913e61ddc3..e143393e7c0 100644 --- a/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java +++ b/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java @@ -11,4 +11,15 @@ public class SchemaInitializationProviderTest { assertEquals("foo\n )", SchemaInitializationProvider.clean("foo,\n )")); assertEquals("foo,bar\n )", SchemaInitializationProvider.clean("foo,bar\n )")); } + + @Test + public void testStripComments() { + String input = "no comment\n" + + " --spacecomment \n" + + "so like definitely no comment\n" + + "-- nospace comment\n"; + String expectedOutput = "no comment\n\n" + + "so like definitely no comment\n\n"; + assertEquals(expectedOutput, SchemaInitializationProvider.stripComments(input)); + } } From 91f4e621481683b24bef031cc68a472ee9992274 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Wed, 11 Dec 2019 15:15:47 -0500 Subject: [PATCH 33/34] Oracle works yay! --- .../tasks/SchemaInitializationProvider.java | 19 +++++++++++----- .../SchemaInitializationProviderTest.java | 22 ++++++++++++++++--- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java index 97a9efda396..4f481d20ae9 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java @@ -39,6 +39,10 @@ import static org.apache.commons.lang3.StringUtils.isBlank; public class SchemaInitializationProvider implements ISchemaInitializationProvider { private static final Pattern ourSqlCommentPattern = Pattern.compile("(?m)^\\s*--.*$"); + private static final Pattern ourQuartzDeletePattern = Pattern.compile("(?m)^delete from qrtz_\\w+;$"); + private static final Pattern ourQuartzDropPattern = Pattern.compile("(?m)^drop table qrtz_\\w+;$"); + + private static final Pattern ourTrailingCommaPattern = Pattern.compile(",(\\s+)\\)"); private final String mySchemaFileClassPath; private final String mySchemaExistsIndicatorTable; @@ -63,12 +67,12 @@ public class SchemaInitializationProvider implements ISchemaInitializationProvid } // Assumes no escaped semicolons... String sqlString = IOUtils.toString(sqlFileInputStream, Charsets.UTF_8); - String sqlStringNoComments = stripComments(sqlString); + String sqlStringNoComments = preProcessLines(sqlString); String[] statements = sqlStringNoComments.split("\\;"); for (String statement : statements) { String cleanedStatement = clean(statement); if (!isBlank(cleanedStatement)) { - retval.add(cleanedStatement + ";"); + retval.add(cleanedStatement); } } } catch (IOException e) { @@ -77,11 +81,16 @@ public class SchemaInitializationProvider implements ISchemaInitializationProvid return retval; } - static String stripComments(String theSqlString) { - return ourSqlCommentPattern.matcher(theSqlString).replaceAll(""); + static String preProcessLines(String theSqlString) { + String pass1 = strip(ourSqlCommentPattern, theSqlString); + String pass2 = strip(ourQuartzDeletePattern, pass1); + String pass3 = strip(ourQuartzDropPattern, pass2); + return pass3.replaceAll("\\n+", "\n"); } - private static final Pattern ourTrailingCommaPattern = Pattern.compile(",(\\s+)\\)"); + private static String strip(Pattern theStripPattern, String theSqlString) { + return theStripPattern.matcher(theSqlString).replaceAll(""); + } static String clean(String theStatement) { // Remove commas before brackets. The Quartz h2 schema has a comma before a closing bracket that fails to execute... diff --git a/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java b/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java index e143393e7c0..21b154183c4 100644 --- a/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java +++ b/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java @@ -18,8 +18,24 @@ public class SchemaInitializationProviderTest { " --spacecomment \n" + "so like definitely no comment\n" + "-- nospace comment\n"; - String expectedOutput = "no comment\n\n" + - "so like definitely no comment\n\n"; - assertEquals(expectedOutput, SchemaInitializationProvider.stripComments(input)); + + String expectedOutput = "no comment\n" + + "so like definitely no comment\n"; + + assertEquals(expectedOutput, SchemaInitializationProvider.preProcessLines(input)); + } + + @Test + public void testStripQuartzDelete() { + String input = "delete from qrtz_paused_trigger_grps;\n" + + "delete from qrtz_locks;\n" + + "delete from qrtz_scheduler_state;\n" + + "\n" + + "drop table qrtz_calendars;\n" + + "drop table qrtz_fired_triggers;\n"; + + String expectedOutput = "\n"; + + assertEquals(expectedOutput, SchemaInitializationProvider.preProcessLines(input)); } } From 83106c92c13d0bb5dc8d645ea8a9249b10113e26 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Wed, 11 Dec 2019 17:00:31 -0500 Subject: [PATCH 34/34] move quartz stuff out --- .../tasks/SchemaInitializationProvider.java | 27 +++--------- .../SchemaInitializationProviderTest.java | 41 ------------------- 2 files changed, 6 insertions(+), 62 deletions(-) delete mode 100644 hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java index 4f481d20ae9..30db7c29569 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProvider.java @@ -32,17 +32,11 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import static org.apache.commons.lang3.StringUtils.isBlank; public class SchemaInitializationProvider implements ISchemaInitializationProvider { - private static final Pattern ourSqlCommentPattern = Pattern.compile("(?m)^\\s*--.*$"); - private static final Pattern ourQuartzDeletePattern = Pattern.compile("(?m)^delete from qrtz_\\w+;$"); - private static final Pattern ourQuartzDropPattern = Pattern.compile("(?m)^drop table qrtz_\\w+;$"); - private static final Pattern ourTrailingCommaPattern = Pattern.compile(",(\\s+)\\)"); private final String mySchemaFileClassPath; private final String mySchemaExistsIndicatorTable; @@ -67,10 +61,10 @@ public class SchemaInitializationProvider implements ISchemaInitializationProvid } // Assumes no escaped semicolons... String sqlString = IOUtils.toString(sqlFileInputStream, Charsets.UTF_8); - String sqlStringNoComments = preProcessLines(sqlString); + String sqlStringNoComments = preProcessSqlString(theDriverType, sqlString); String[] statements = sqlStringNoComments.split("\\;"); for (String statement : statements) { - String cleanedStatement = clean(statement); + String cleanedStatement = preProcessSqlStatement(theDriverType, statement); if (!isBlank(cleanedStatement)) { retval.add(cleanedStatement); } @@ -81,21 +75,12 @@ public class SchemaInitializationProvider implements ISchemaInitializationProvid return retval; } - static String preProcessLines(String theSqlString) { - String pass1 = strip(ourSqlCommentPattern, theSqlString); - String pass2 = strip(ourQuartzDeletePattern, pass1); - String pass3 = strip(ourQuartzDropPattern, pass2); - return pass3.replaceAll("\\n+", "\n"); + protected String preProcessSqlString(DriverTypeEnum theDriverType, String sqlString) { + return sqlString; } - private static String strip(Pattern theStripPattern, String theSqlString) { - return theStripPattern.matcher(theSqlString).replaceAll(""); - } - - static String clean(String theStatement) { - // Remove commas before brackets. The Quartz h2 schema has a comma before a closing bracket that fails to execute... - Matcher matcher = ourTrailingCommaPattern.matcher(theStatement); - return matcher.replaceAll("$1\\)"); + protected String preProcessSqlStatement(DriverTypeEnum theDriverType, String sqlStatement) { + return sqlStatement; } @Nonnull diff --git a/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java b/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java deleted file mode 100644 index 21b154183c4..00000000000 --- a/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/tasks/SchemaInitializationProviderTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package ca.uhn.fhir.jpa.migrate.tasks; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class SchemaInitializationProviderTest { - @Test - public void testClean() { - assertEquals("foo\n)", SchemaInitializationProvider.clean("foo,\n)")); - assertEquals("foo\n )", SchemaInitializationProvider.clean("foo,\n )")); - assertEquals("foo,bar\n )", SchemaInitializationProvider.clean("foo,bar\n )")); - } - - @Test - public void testStripComments() { - String input = "no comment\n" + - " --spacecomment \n" + - "so like definitely no comment\n" + - "-- nospace comment\n"; - - String expectedOutput = "no comment\n" + - "so like definitely no comment\n"; - - assertEquals(expectedOutput, SchemaInitializationProvider.preProcessLines(input)); - } - - @Test - public void testStripQuartzDelete() { - String input = "delete from qrtz_paused_trigger_grps;\n" + - "delete from qrtz_locks;\n" + - "delete from qrtz_scheduler_state;\n" + - "\n" + - "drop table qrtz_calendars;\n" + - "drop table qrtz_fired_triggers;\n"; - - String expectedOutput = "\n"; - - assertEquals(expectedOutput, SchemaInitializationProvider.preProcessLines(input)); - } -}