Cancel periodic cleanup task on plugin unload

Change-Id: I99206ffce8d0c811cba66ed7d92408c82387ce74
diff --git a/src/main/java/com/googlesource/gerrit/plugins/websession/flatfile/FlatFileWebSessionCacheCleaner.java b/src/main/java/com/googlesource/gerrit/plugins/websession/flatfile/FlatFileWebSessionCacheCleaner.java
index c6c89a6..3e97dc9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/websession/flatfile/FlatFileWebSessionCacheCleaner.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/websession/flatfile/FlatFileWebSessionCacheCleaner.java
@@ -19,14 +19,19 @@
 import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.gerrit.server.git.WorkQueue;
 import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+import java.util.concurrent.ScheduledFuture;
 
 class FlatFileWebSessionCacheCleaner implements Runnable {
 
+  @Singleton
   static class CleanerLifecycle implements LifecycleListener {
     private static final int INITIAL_DELAY_MS = 1000;
     private final WorkQueue queue;
     private final FlatFileWebSessionCacheCleaner cleaner;
     private final long cleanupInterval;
+    private ScheduledFuture<?> scheduledCleanupTask;
 
     @Inject
     CleanerLifecycle(
@@ -40,12 +45,16 @@
 
     @Override
     public void start() {
-      queue.getDefaultQueue().scheduleAtFixedRate(cleaner, INITIAL_DELAY_MS,
-          cleanupInterval, MILLISECONDS);
+      scheduledCleanupTask = queue.getDefaultQueue().scheduleAtFixedRate(
+          cleaner, INITIAL_DELAY_MS, cleanupInterval, MILLISECONDS);
     }
 
     @Override
     public void stop() {
+      if (scheduledCleanupTask != null) {
+        scheduledCleanupTask.cancel(true);
+        scheduledCleanupTask = null;
+      }
     }
   }