From dacb5fd195b0d2f96a34c3fcf2ccf821af25f245 Mon Sep 17 00:00:00 2001 From: Gustav Karlsson Date: Tue, 30 Jan 2024 19:46:23 +0100 Subject: [PATCH] Allow override to always UTC --- .../autoconfigure/DbSchedulerAutoConfiguration.java | 4 ++++ .../boot/config/DbSchedulerProperties.java | 13 +++++++++++++ .../kagkarlsson/scheduler/SchedulerBuilder.java | 8 +++++++- .../src/main/resources/application.properties | 1 + 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/db-scheduler-boot-starter/src/main/java/com/github/kagkarlsson/scheduler/boot/autoconfigure/DbSchedulerAutoConfiguration.java b/db-scheduler-boot-starter/src/main/java/com/github/kagkarlsson/scheduler/boot/autoconfigure/DbSchedulerAutoConfiguration.java index 5f99f71d..3162dc7a 100644 --- a/db-scheduler-boot-starter/src/main/java/com/github/kagkarlsson/scheduler/boot/autoconfigure/DbSchedulerAutoConfiguration.java +++ b/db-scheduler-boot-starter/src/main/java/com/github/kagkarlsson/scheduler/boot/autoconfigure/DbSchedulerAutoConfiguration.java @@ -151,6 +151,10 @@ public Scheduler scheduler(DbSchedulerCustomizer customizer, StatsRegistry regis .jdbcCustomization() .orElse(new AutodetectJdbcCustomization(transactionalDataSource))); + if (config.isAlwaysPersistTimestampInUtc()) { + builder.alwaysPersistTimestampInUTC(); + } + if (config.isImmediateExecutionEnabled()) { builder.enableImmediateExecution(); } diff --git a/db-scheduler-boot-starter/src/main/java/com/github/kagkarlsson/scheduler/boot/config/DbSchedulerProperties.java b/db-scheduler-boot-starter/src/main/java/com/github/kagkarlsson/scheduler/boot/config/DbSchedulerProperties.java index cd86fdf4..cf43720e 100644 --- a/db-scheduler-boot-starter/src/main/java/com/github/kagkarlsson/scheduler/boot/config/DbSchedulerProperties.java +++ b/db-scheduler-boot-starter/src/main/java/com/github/kagkarlsson/scheduler/boot/config/DbSchedulerProperties.java @@ -101,6 +101,11 @@ public class DbSchedulerProperties { @DurationUnit(SECONDS) private Duration shutdownMaxWait = SchedulerBuilder.SHUTDOWN_MAX_WAIT; + /** + * Store timestamps in UTC timezone even though the schema supports storing timezone information + */ + private boolean alwaysPersistTimestampInUtc = false; + /** Which log level to use when logging task failures. Defaults to {@link LogLevel#DEBUG}. */ private LogLevel failureLoggerLevel = SchedulerBuilder.DEFAULT_FAILURE_LOG_LEVEL; @@ -228,4 +233,12 @@ public void setPollingStrategyUpperLimitFractionOfThreads( double pollingStrategyUpperLimitFractionOfThreads) { this.pollingStrategyUpperLimitFractionOfThreads = pollingStrategyUpperLimitFractionOfThreads; } + + public boolean isAlwaysPersistTimestampInUtc() { + return alwaysPersistTimestampInUtc; + } + + public void setAlwaysPersistTimestampInUtc(boolean alwaysPersistTimestampInUTC) { + this.alwaysPersistTimestampInUtc = alwaysPersistTimestampInUTC; + } } diff --git a/db-scheduler/src/main/java/com/github/kagkarlsson/scheduler/SchedulerBuilder.java b/db-scheduler/src/main/java/com/github/kagkarlsson/scheduler/SchedulerBuilder.java index 3c2fb0c9..d6b1e81e 100644 --- a/db-scheduler/src/main/java/com/github/kagkarlsson/scheduler/SchedulerBuilder.java +++ b/db-scheduler/src/main/java/com/github/kagkarlsson/scheduler/SchedulerBuilder.java @@ -74,6 +74,7 @@ public class SchedulerBuilder { protected LogLevel logLevel = DEFAULT_FAILURE_LOG_LEVEL; protected boolean logStackTrace = LOG_STACK_TRACE_ON_FAILURE; private boolean registerShutdownHook = false; + private boolean alwaysPersistTimestampInUTC = false; public SchedulerBuilder(DataSource dataSource, List> knownTasks) { this.dataSource = dataSource; @@ -156,6 +157,11 @@ public SchedulerBuilder jdbcCustomization(JdbcCustomization jdbcCustomization) { return this; } + public SchedulerBuilder alwaysPersistTimestampInUTC() { + this.alwaysPersistTimestampInUTC = true; + return this; + } + public SchedulerBuilder shutdownMaxWait(Duration shutdownMaxWait) { this.shutdownMaxWait = shutdownMaxWait; return this; @@ -208,7 +214,7 @@ public Scheduler build() { final TaskResolver taskResolver = new TaskResolver(statsRegistry, clock, knownTasks); final JdbcCustomization jdbcCustomization = ofNullable(this.jdbcCustomization) - .orElseGet(() -> new AutodetectJdbcCustomization(dataSource)); + .orElseGet(() -> new AutodetectJdbcCustomization(dataSource, alwaysPersistTimestampInUTC)); final JdbcTaskRepository schedulerTaskRepository = new JdbcTaskRepository( dataSource, diff --git a/examples/spring-boot-example/src/main/resources/application.properties b/examples/spring-boot-example/src/main/resources/application.properties index 90bf6283..9b1d2472 100644 --- a/examples/spring-boot-example/src/main/resources/application.properties +++ b/examples/spring-boot-example/src/main/resources/application.properties @@ -17,3 +17,4 @@ db-scheduler.polling-strategy=fetch db-scheduler.polling-strategy-lower-limit-fraction-of-threads=0.5 db-scheduler.polling-strategy-upper-limit-fraction-of-threads=3.0 db-scheduler.shutdown-max-wait=30m +db-scheduler.always-persist-timestamp-in-utc=false