diff --git a/src/main/java/com/commafeed/CommaFeedApplication.java b/src/main/java/com/commafeed/CommaFeedApplication.java index d537db6a..37414c44 100644 --- a/src/main/java/com/commafeed/CommaFeedApplication.java +++ b/src/main/java/com/commafeed/CommaFeedApplication.java @@ -64,6 +64,9 @@ import com.commafeed.backend.service.PasswordEncryptionService; import com.commafeed.backend.service.PubSubService; import com.commafeed.backend.service.StartupService; import com.commafeed.backend.service.UserService; +import com.commafeed.backend.task.OldStatusesCleanupTask; +import com.commafeed.backend.task.OrphansCleanupTask; +import com.commafeed.backend.task.SchedulingService; import com.commafeed.frontend.auth.SecurityCheckProvider; import com.commafeed.frontend.auth.SecurityCheckProvider.SecurityCheckUserServiceProvider; import com.commafeed.frontend.resource.AdminREST; @@ -194,13 +197,21 @@ public class CommaFeedApplication extends Application { environment.servlets().addServlet("next", nextUnreadServlet).addMapping("/next"); environment.servlets().addServlet("logout", logoutServlet).addMapping("/logout"); + // Tasks + SchedulingService schedulingService = new SchedulingService(); + schedulingService.register(new OldStatusesCleanupTask(sessionFactory, config, cleaningService)); + schedulingService.register(new OrphansCleanupTask(sessionFactory, cleaningService)); + // Managed objects environment.lifecycle().manage(startupService); environment.lifecycle().manage(taskGiver); environment.lifecycle().manage(feedWorker); environment.lifecycle().manage(feedUpdater); + environment.lifecycle().manage(schedulingService); // TODO translations + // TODO swagger ui + } public static void main(String[] args) throws Exception { diff --git a/src/main/java/com/commafeed/backend/task/OldStatusesCleanupTask.java b/src/main/java/com/commafeed/backend/task/OldStatusesCleanupTask.java new file mode 100644 index 00000000..498e7dd7 --- /dev/null +++ b/src/main/java/com/commafeed/backend/task/OldStatusesCleanupTask.java @@ -0,0 +1,51 @@ +package com.commafeed.backend.task; + +import java.util.Date; +import java.util.concurrent.TimeUnit; + +import lombok.RequiredArgsConstructor; + +import org.hibernate.SessionFactory; + +import com.commafeed.CommaFeedConfiguration; +import com.commafeed.backend.dao.UnitOfWork; +import com.commafeed.backend.service.DatabaseCleaningService; +import com.commafeed.backend.task.SchedulingService.ScheduledTask; + +@RequiredArgsConstructor +public class OldStatusesCleanupTask implements ScheduledTask { + + private final SessionFactory sessionFactory; + private final CommaFeedConfiguration config; + private final DatabaseCleaningService cleaner; + + @Override + public void run() { + new UnitOfWork(sessionFactory) { + @Override + protected Void runInSession() throws Exception { + Date threshold = config.getApplicationSettings().getUnreadThreshold(); + if (threshold != null) { + cleaner.cleanStatusesOlderThan(threshold); + } + return null; + } + }.run(); + } + + @Override + public long getInitialDelay() { + return 5; + } + + @Override + public long getPeriod() { + return 60; + } + + @Override + public TimeUnit getTimeUnit() { + return TimeUnit.MINUTES; + } + +} diff --git a/src/main/java/com/commafeed/backend/task/OrphansCleanupTask.java b/src/main/java/com/commafeed/backend/task/OrphansCleanupTask.java new file mode 100644 index 00000000..74835027 --- /dev/null +++ b/src/main/java/com/commafeed/backend/task/OrphansCleanupTask.java @@ -0,0 +1,47 @@ +package com.commafeed.backend.task; + +import java.util.concurrent.TimeUnit; + +import lombok.RequiredArgsConstructor; + +import org.hibernate.SessionFactory; + +import com.commafeed.backend.dao.UnitOfWork; +import com.commafeed.backend.service.DatabaseCleaningService; +import com.commafeed.backend.task.SchedulingService.ScheduledTask; + +@RequiredArgsConstructor +public class OrphansCleanupTask implements ScheduledTask { + + private final SessionFactory sessionFactory; + private final DatabaseCleaningService cleaner; + + @Override + public void run() { + new UnitOfWork(sessionFactory) { + @Override + protected Void runInSession() throws Exception { + cleaner.cleanEntriesWithoutSubscriptions(); + cleaner.cleanFeedsWithoutSubscriptions(); + cleaner.cleanContentsWithoutEntries(); + return null; + } + }.run(); + } + + @Override + public long getInitialDelay() { + return 30; + } + + @Override + public long getPeriod() { + return 60; + } + + @Override + public TimeUnit getTimeUnit() { + return TimeUnit.MINUTES; + } + +} diff --git a/src/main/java/com/commafeed/backend/task/SchedulingService.java b/src/main/java/com/commafeed/backend/task/SchedulingService.java new file mode 100644 index 00000000..ea6b341c --- /dev/null +++ b/src/main/java/com/commafeed/backend/task/SchedulingService.java @@ -0,0 +1,56 @@ +package com.commafeed.backend.task; + +import io.dropwizard.lifecycle.Managed; + +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import lombok.extern.slf4j.Slf4j; + +import com.google.common.collect.Lists; + +@Slf4j +public class SchedulingService implements Managed { + + public static interface ScheduledTask { + void run(); + + long getInitialDelay(); + + long getPeriod(); + + TimeUnit getTimeUnit(); + } + + private List tasks = Lists.newArrayList(); + private ScheduledExecutorService executor; + + @Override + public void start() throws Exception { + executor = Executors.newScheduledThreadPool(tasks.size()); + for (final ScheduledTask task : tasks) { + Runnable runnable = new Runnable() { + @Override + public void run() { + try { + task.run(); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + }; + executor.scheduleWithFixedDelay(runnable, task.getInitialDelay(), task.getPeriod(), task.getTimeUnit()); + } + } + + @Override + public void stop() throws Exception { + executor.shutdown(); + } + + public void register(ScheduledTask task) { + tasks.add(task); + } +}