diff --git a/commafeed-server/src/main/java/com/commafeed/CommaFeedApplication.java b/commafeed-server/src/main/java/com/commafeed/CommaFeedApplication.java index 545e21a0..062a2c79 100644 --- a/commafeed-server/src/main/java/com/commafeed/CommaFeedApplication.java +++ b/commafeed-server/src/main/java/com/commafeed/CommaFeedApplication.java @@ -22,6 +22,8 @@ public class CommaFeedApplication { private final CommaFeedConfiguration config; public void start(@Observes StartupEvent ev) { + log.info("starting up..."); + PasswordConstraintValidator.setMinimumPasswordLength(config.users().minimumPasswordLength()); feedRefreshEngine.start(); diff --git a/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java b/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java index 36498277..0ef815df 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java @@ -42,12 +42,12 @@ public class FeedRefreshEngine { private final BlockingDeque queue; - private final ExecutorService feedProcessingLoopExecutor; - private final ExecutorService refillLoopExecutor; - private final ExecutorService refillExecutor; - private final ThreadPoolExecutor workerExecutor; - private final ThreadPoolExecutor databaseUpdaterExecutor; - private final ThreadPoolExecutor notifierExecutor; + private ExecutorService feedProcessingLoopExecutor; + private ExecutorService refillLoopExecutor; + private ThreadPoolExecutor refillExecutor; + private ThreadPoolExecutor workerExecutor; + private ThreadPoolExecutor databaseUpdaterExecutor; + private ThreadPoolExecutor notifierExecutor; public FeedRefreshEngine(UnitOfWork unitOfWork, FeedDAO feedDAO, FeedRefreshWorker worker, FeedRefreshUpdater updater, FeedUpdateNotifier notifier, CommaFeedConfiguration config, MetricRegistry metrics) { @@ -61,6 +61,15 @@ public class FeedRefreshEngine { this.queue = new LinkedBlockingDeque<>(); + metrics.register(MetricRegistry.name(getClass(), "queue", "size"), (Gauge) queue::size); + metrics.register(MetricRegistry.name(getClass(), "worker", "active"), (Gauge) () -> workerExecutor.getActiveCount()); + metrics.register(MetricRegistry.name(getClass(), "updater", "active"), + (Gauge) () -> databaseUpdaterExecutor.getActiveCount()); + metrics.register(MetricRegistry.name(getClass(), "notifier", "active"), (Gauge) () -> notifierExecutor.getActiveCount()); + metrics.register(MetricRegistry.name(getClass(), "notifier", "queue"), (Gauge) () -> notifierExecutor.getQueue().size()); + } + + private void createExecutors() { this.feedProcessingLoopExecutor = Executors.newSingleThreadExecutor(); this.refillLoopExecutor = Executors.newSingleThreadExecutor(); this.refillExecutor = newDiscardingSingleThreadExecutorService(); @@ -68,15 +77,10 @@ public class FeedRefreshEngine { this.databaseUpdaterExecutor = newBlockingExecutorService(config.feedRefresh().databaseThreads()); this.notifierExecutor = newDiscardingExecutorService(config.pushNotifications().threads(), config.pushNotifications().queueCapacity()); - - metrics.register(MetricRegistry.name(getClass(), "queue", "size"), (Gauge) queue::size); - metrics.register(MetricRegistry.name(getClass(), "worker", "active"), (Gauge) workerExecutor::getActiveCount); - metrics.register(MetricRegistry.name(getClass(), "updater", "active"), (Gauge) databaseUpdaterExecutor::getActiveCount); - metrics.register(MetricRegistry.name(getClass(), "notifier", "active"), (Gauge) notifierExecutor::getActiveCount); - metrics.register(MetricRegistry.name(getClass(), "notifier", "queue"), (Gauge) () -> notifierExecutor.getQueue().size()); } public void start() { + createExecutors(); startFeedProcessingLoop(); startRefillLoop(); } @@ -204,6 +208,8 @@ public class FeedRefreshEngine { MoreExecutors.shutdownAndAwaitTermination(this.workerExecutor, config.shutdownTimeout()); MoreExecutors.shutdownAndAwaitTermination(this.databaseUpdaterExecutor, config.shutdownTimeout()); MoreExecutors.shutdownAndAwaitTermination(this.notifierExecutor, config.shutdownTimeout()); + + queue.clear(); } /** diff --git a/commafeed-server/src/main/java/com/commafeed/backend/task/ScheduledTask.java b/commafeed-server/src/main/java/com/commafeed/backend/task/ScheduledTask.java index b9fbdeb6..fc29c92c 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/task/ScheduledTask.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/task/ScheduledTask.java @@ -23,8 +23,8 @@ public abstract class ScheduledTask { log.error(e.getMessage(), e); } }; - log.info("registering task {} for execution every {} {}, starting in {} {}", getClass().getSimpleName(), getPeriod(), getTimeUnit(), - getInitialDelay(), getTimeUnit()); + log.debug("registering task {} for execution every {} {}, starting in {} {}", getClass().getSimpleName(), getPeriod(), + getTimeUnit(), getInitialDelay(), getTimeUnit()); executor.scheduleWithFixedDelay(runnable, getInitialDelay(), getPeriod(), getTimeUnit()); } } diff --git a/commafeed-server/src/main/java/com/commafeed/backend/task/TaskScheduler.java b/commafeed-server/src/main/java/com/commafeed/backend/task/TaskScheduler.java index f63c5cb9..4e511bb6 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/task/TaskScheduler.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/task/TaskScheduler.java @@ -18,16 +18,17 @@ public class TaskScheduler { private final List tasks; private final CommaFeedConfiguration config; - private final ScheduledExecutorService executor; + + private ScheduledExecutorService executor; public TaskScheduler(@All List tasks, CommaFeedConfiguration config) { this.tasks = tasks; this.config = config; - this.executor = Executors.newScheduledThreadPool(tasks.size()); } public void start() { - tasks.forEach(task -> task.register(executor)); + this.executor = Executors.newScheduledThreadPool(tasks.size()); + this.tasks.forEach(task -> task.register(executor)); } public void stop() { diff --git a/commafeed-server/src/test/java/com/commafeed/DatabaseReset.java b/commafeed-server/src/test/java/com/commafeed/DatabaseReset.java index a8776931..25784b30 100644 --- a/commafeed-server/src/test/java/com/commafeed/DatabaseReset.java +++ b/commafeed-server/src/test/java/com/commafeed/DatabaseReset.java @@ -6,6 +6,8 @@ import jakarta.persistence.EntityManager; import org.hibernate.Session; import org.kohsuke.MetaInfServices; +import io.quarkus.runtime.ShutdownEvent; +import io.quarkus.runtime.StartupEvent; import io.quarkus.test.junit.callback.QuarkusTestBeforeEachCallback; import io.quarkus.test.junit.callback.QuarkusTestMethodContext; @@ -17,12 +19,17 @@ public class DatabaseReset implements QuarkusTestBeforeEachCallback { @Override public void beforeEach(QuarkusTestMethodContext context) { - CDI.current() - .select(EntityManager.class) - .get() - .unwrap(Session.class) - .getSessionFactory() - .getSchemaManager() - .truncateMappedObjects(); + // stop the application to make sure that there are no active transactions when we truncate the tables + getBean(CommaFeedApplication.class).stop(new ShutdownEvent()); + + // truncate all tables so that we have a clean slate for the next test + getBean(EntityManager.class).unwrap(Session.class).getSessionFactory().getSchemaManager().truncateMappedObjects(); + + // restart the application + getBean(CommaFeedApplication.class).start(new StartupEvent()); + } + + private static T getBean(Class clazz) { + return CDI.current().select(clazz).get(); } }