From 8b031ee6d4d9e31d9b3c9240c241a151c02cc3e7 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Tue, 11 Aug 2020 08:17:36 +0200
Subject: [PATCH] OO-4840: shutdown executors

---
 .../taskexecutor/_spring/taskExecutorCorecontext.xml   |  2 +-
 .../taskexecutor/manager/TaskExecutorManagerImpl.java  |  5 +++--
 .../org/olat/core/util/mail/_spring/mailContext.xml    |  3 ++-
 .../livestream/manager/LiveStreamServiceImpl.java      | 10 +++++++++-
 4 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/src/main/java/org/olat/core/commons/services/taskexecutor/_spring/taskExecutorCorecontext.xml b/src/main/java/org/olat/core/commons/services/taskexecutor/_spring/taskExecutorCorecontext.xml
index 41bb7c78a64..f9150b090e0 100644
--- a/src/main/java/org/olat/core/commons/services/taskexecutor/_spring/taskExecutorCorecontext.xml
+++ b/src/main/java/org/olat/core/commons/services/taskexecutor/_spring/taskExecutorCorecontext.xml
@@ -5,7 +5,7 @@
   http://www.springframework.org/schema/beans 
   http://www.springframework.org/schema/beans/spring-beans.xsd">
 
-	<bean id="taskExecutorManager" class="org.olat.core.commons.services.taskexecutor.manager.TaskExecutorManagerImpl">
+	<bean id="taskExecutorManager" class="org.olat.core.commons.services.taskexecutor.manager.TaskExecutorManagerImpl" destroy-method="shutdown">
 		<constructor-arg index="0" ref="mpTaskExecutorService" />
 		<constructor-arg index="1" ref="sequentialTaskExecutorService" />
 		<constructor-arg index="2" ref="lowPriorityTaskSpringExecutorService" />
diff --git a/src/main/java/org/olat/core/commons/services/taskexecutor/manager/TaskExecutorManagerImpl.java b/src/main/java/org/olat/core/commons/services/taskexecutor/manager/TaskExecutorManagerImpl.java
index 68a6839efb1..bac4c1fcbab 100644
--- a/src/main/java/org/olat/core/commons/services/taskexecutor/manager/TaskExecutorManagerImpl.java
+++ b/src/main/java/org/olat/core/commons/services/taskexecutor/manager/TaskExecutorManagerImpl.java
@@ -108,8 +108,9 @@ public class TaskExecutorManagerImpl implements TaskExecutorManager {
 	}
 
 	public void shutdown() {
-		taskExecutor.shutdown();
-		sequentialTaskExecutor.shutdown();
+		taskExecutor.shutdownNow();
+		sequentialTaskExecutor.shutdownNow();
+		lowPriorityTaskExecutor.shutdownNow();
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/core/util/mail/_spring/mailContext.xml b/src/main/java/org/olat/core/util/mail/_spring/mailContext.xml
index b864cac3ad1..8d6f85d7569 100644
--- a/src/main/java/org/olat/core/util/mail/_spring/mailContext.xml
+++ b/src/main/java/org/olat/core/util/mail/_spring/mailContext.xml
@@ -13,11 +13,12 @@
 		<property name="className" value="org.olat.core.util.mail.ui.SendDocumentsByEMailController"/>
 	</bean>
 	
-		<bean id="mailAsyncExecutorService" class="org.springframework.core.task.support.ExecutorServiceAdapter">
+	<bean id="mailAsyncExecutorService" class="org.springframework.core.task.support.ExecutorServiceAdapter">
 		<constructor-arg index="0" ref="mailAsyncExecutor" />
 	</bean>
 	
 	<bean id="mailAsyncExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
+		<property name="waitForTasksToCompleteOnShutdown" value="true" />
 		<property name="corePoolSize" value="1" />
 		<property name="maxPoolSize" value="1" />
 		<property name="queueCapacity" value="2000" />
diff --git a/src/main/java/org/olat/course/nodes/livestream/manager/LiveStreamServiceImpl.java b/src/main/java/org/olat/course/nodes/livestream/manager/LiveStreamServiceImpl.java
index 19bc4eaf66c..482eaf2cf22 100644
--- a/src/main/java/org/olat/course/nodes/livestream/manager/LiveStreamServiceImpl.java
+++ b/src/main/java/org/olat/course/nodes/livestream/manager/LiveStreamServiceImpl.java
@@ -51,6 +51,7 @@ import org.olat.course.nodes.livestream.LiveStreamService;
 import org.olat.course.nodes.livestream.model.LiveStreamEventImpl;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryRef;
+import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
 import org.springframework.stereotype.Service;
@@ -62,7 +63,7 @@ import org.springframework.stereotype.Service;
  *
  */
 @Service
-public class LiveStreamServiceImpl implements LiveStreamService {
+public class LiveStreamServiceImpl implements LiveStreamService, DisposableBean {
 	
 	private static final Logger log = Tracing.createLoggerFor(LiveStreamServiceImpl.class);
 	
@@ -84,6 +85,13 @@ public class LiveStreamServiceImpl implements LiveStreamService {
 		return scheduler;
 	}
 
+	@Override
+	public void destroy() throws Exception {
+		if(scheduler != null) {
+			scheduler.shutdownNow();
+		}
+	}
+
 	@Override
 	public List<? extends LiveStreamEvent> getRunningEvents(CourseCalendars calendars, int bufferBeforeMin,
 			int bufferAfterMin) {
-- 
GitLab