This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch 2_1_X
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/2_1_X by this push:
     new 68c2af4  [SYNCOPE-1670] Enable for graceful shutdown (#331)
68c2af4 is described below

commit 68c2af4aeb472f92646be0970e47e2dbdf95a8aa
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Tue Mar 29 13:18:07 2022 +0200

    [SYNCOPE-1670] Enable for graceful shutdown (#331)
---
 .../{LogicInitializer.java => LogicStartStop.java} | 49 ++++++++++++++--------
 .../core/logic/init/TaskExecutorUnloader.java      | 37 ++++++++++------
 .../core/persistence/api/SyncopeLoader.java        | 15 +++++--
 .../core/provisioning/java/job/JobManagerImpl.java |  2 +-
 .../provisioning/java/job/SchedulerShutdown.java   | 45 --------------------
 .../src/main/resources/provisioning.properties     |  8 +++-
 .../src/main/resources/provisioningContext.xml     | 29 +++++++++----
 .../rest-cxf/src/main/resources/restCXFContext.xml | 15 +++++--
 .../main/resources/provisioning.properties.mariadb |  8 +++-
 .../main/resources/provisioning.properties.mssql   |  8 +++-
 .../main/resources/provisioning.properties.myjson  |  8 +++-
 .../main/resources/provisioning.properties.mysql   |  8 +++-
 .../main/resources/provisioning.properties.pgjsonb |  8 +++-
 .../resources/provisioning.properties.postgresql   |  8 +++-
 .../src/main/resources/provisioning.properties     |  8 +++-
 .../core/flowable/support/DomainProcessEngine.java |  4 +-
 .../support/DomainProcessEngineFactoryBean.java    |  9 ++--
 .../syncope/core/logic/init/OIDCClientLoader.java  |  4 +-
 .../syncope/core/logic/init/SAML2SPLoader.java     | 20 ++++-----
 .../src/main/resources/all/provisioning.properties |  8 +++-
 .../src/main/resources/jboss/restCXFContext.xml    | 15 +++++--
 .../main/resources/mariadb/provisioning.properties |  8 +++-
 .../main/resources/myjson/provisioning.properties  |  8 +++-
 .../main/resources/mysql/provisioning.properties   |  8 +++-
 .../main/resources/oracle/provisioning.properties  |  8 +++-
 .../main/resources/pgjsonb/provisioning.properties |  8 +++-
 .../resources/postgres/provisioning.properties     |  8 +++-
 .../src/main/resources/provisioning.properties     |  8 +++-
 .../resources/sqlserver/provisioning.properties    |  8 +++-
 29 files changed, 229 insertions(+), 151 deletions(-)

diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/init/LogicInitializer.java
 
b/core/logic/src/main/java/org/apache/syncope/core/logic/init/LogicStartStop.java
similarity index 65%
rename from 
core/logic/src/main/java/org/apache/syncope/core/logic/init/LogicInitializer.java
rename to 
core/logic/src/main/java/org/apache/syncope/core/logic/init/LogicStartStop.java
index 3e1b1c9..e838a22 100644
--- 
a/core/logic/src/main/java/org/apache/syncope/core/logic/init/LogicInitializer.java
+++ 
b/core/logic/src/main/java/org/apache/syncope/core/logic/init/LogicStartStop.java
@@ -20,50 +20,65 @@ package org.apache.syncope.core.logic.init;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
-import java.util.Map;
-import org.apache.syncope.core.spring.ApplicationContextProvider;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
 import org.apache.syncope.core.persistence.api.SyncopeLoader;
+import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.aop.support.AopUtils;
 import org.springframework.beans.factory.BeanFactory;
 import org.springframework.beans.factory.BeanFactoryAware;
+import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.support.DefaultListableBeanFactory;
 import org.springframework.stereotype.Component;
 
 /**
- * Take care of all initializations needed by Syncope logic to run up and safe.
+ * Take care of all initializations needed by Syncope logic to run up and safe
+ * and all clean up needed to shut down gracefully.
  */
 @Component
-public class LogicInitializer implements InitializingBean, BeanFactoryAware {
+public class LogicStartStop implements BeanFactoryAware, InitializingBean, 
DisposableBean {
 
-    private static final Logger LOG = 
LoggerFactory.getLogger(LogicInitializer.class);
+    private static final Logger LOG = 
LoggerFactory.getLogger(LogicStartStop.class);
 
     private DefaultListableBeanFactory beanFactory;
 
+    private final List<SyncopeLoader> loaders = new ArrayList<>();
+
     @Override
     public void setBeanFactory(final BeanFactory beanFactory) {
         this.beanFactory = (DefaultListableBeanFactory) beanFactory;
     }
 
+    private void execute(final Consumer<SyncopeLoader> action) {
+        loaders.forEach(loader -> {
+            LOG.debug("Invoking {} with priority {}", 
AopUtils.getTargetClass(loader).getName(), loader.getPriority());
+            action.accept(loader);
+        });
+    }
+
     @Override
     public void afterPropertiesSet() throws Exception {
-        Map<String, SyncopeLoader> loaderMap = 
beanFactory.getBeansOfType(SyncopeLoader.class);
+        ApplicationContextProvider.setBeanFactory(beanFactory);
 
-        List<SyncopeLoader> loaders = new ArrayList<>(loaderMap.values());
-        Collections.sort(loaders, (o1, o2) -> 
o1.getPriority().compareTo(o2.getPriority()));
+        
loaders.addAll(beanFactory.getBeansOfType(SyncopeLoader.class).values().stream().
+                
sorted(Comparator.comparing(SyncopeLoader::getPriority)).collect(Collectors.toList()));
 
-        ApplicationContextProvider.setBeanFactory(beanFactory);
+        LOG.debug("Starting init...");
+        execute(SyncopeLoader::load);
+        LOG.debug("Init completed");
+    }
 
-        LOG.debug("Starting initialization...");
-        loaders.stream().map(loader -> {
-            LOG.debug("Invoking {} with priority {}", 
AopUtils.getTargetClass(loader).getName(), loader.getPriority());
-            return loader;
-        }).forEachOrdered(loader -> {
-            loader.load();
-        });
-        LOG.debug("Initialization completed");
+    @Override
+    public void destroy() throws Exception {
+        Collections.reverse(loaders);
+
+        LOG.debug("Starting dispose...");
+        execute(SyncopeLoader::unload);
+        LOG.debug("Dispose completed");
     }
 }
diff --git 
a/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/init/OIDCClientLoader.java
 
b/core/logic/src/main/java/org/apache/syncope/core/logic/init/TaskExecutorUnloader.java
similarity index 50%
copy from 
ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/init/OIDCClientLoader.java
copy to 
core/logic/src/main/java/org/apache/syncope/core/logic/init/TaskExecutorUnloader.java
index e972305..e66ff09 100644
--- 
a/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/init/OIDCClientLoader.java
+++ 
b/core/logic/src/main/java/org/apache/syncope/core/logic/init/TaskExecutorUnloader.java
@@ -18,31 +18,44 @@
  */
 package org.apache.syncope.core.logic.init;
 
-import org.apache.syncope.common.lib.types.OIDCClientEntitlement;
-import org.apache.syncope.core.persistence.api.DomainsHolder;
+import java.util.HashMap;
+import java.util.Map;
 import org.apache.syncope.core.persistence.api.SyncopeLoader;
-import org.apache.syncope.core.provisioning.api.EntitlementsHolder;
-import org.apache.syncope.core.spring.security.AuthContextUtils;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.apache.syncope.core.spring.ApplicationContextProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.concurrent.ExecutorConfigurationSupport;
 import org.springframework.stereotype.Component;
 
 @Component
-public class OIDCClientLoader implements SyncopeLoader {
+public class TaskExecutorUnloader implements SyncopeLoader {
 
-    @Autowired
-    private DomainsHolder domainsHolder;
+    private static final Logger LOG = 
LoggerFactory.getLogger(TaskExecutorUnloader.class);
+
+    private final Map<String, ExecutorConfigurationSupport> tptes = new 
HashMap<>();
 
     @Override
     public Integer getPriority() {
-        return 1000;
+        return Integer.MIN_VALUE;
     }
 
     @Override
     public void load() {
-        EntitlementsHolder.getInstance().init(OIDCClientEntitlement.values());
+        tptes.putAll(ApplicationContextProvider.getApplicationContext().
+                getBeansOfType(ExecutorConfigurationSupport.class));
+    }
+
+    @Override
+    public void unload() {
+        tptes.forEach((name, tpte) -> {
+            LOG.info("Shutting down ThreadPoolTaskExecutor {}...", name);
+            try {
+                tpte.shutdown();
 
-        domainsHolder.getDomains().forEach((domain, datasource) -> {
-            AuthContextUtils.execWithAuthContext(domain, () -> null);
+                LOG.info("Successfully shut down ThreadPoolTaskExecutor {}", 
name);
+            } catch (Exception e) {
+                LOG.error("While shutting down ThreadPoolTaskExecutor {}", 
name, e);
+            }
         });
     }
 }
diff --git 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/SyncopeLoader.java
 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/SyncopeLoader.java
index be0caed..f19b480 100644
--- 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/SyncopeLoader.java
+++ 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/SyncopeLoader.java
@@ -24,12 +24,21 @@ package org.apache.syncope.core.persistence.api;
 public interface SyncopeLoader {
 
     /**
-     * @return the priority that the implementing class has in the 
initialization process.
+     * @return the priority that the implementing class has in the init and 
shut down processes.
      */
     Integer getPriority();
 
     /**
-     * Perform initialization operations.
+     * Perform init operations.
      */
-    void load();
+    default void load() {
+        // do nothing
+    }
+
+    /**
+     * Perform dispose operations.
+     */
+    default void unload() {
+        // do nothing
+    }
 }
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobManagerImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobManagerImpl.java
index 13a5b21..fb6e8bf 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobManagerImpl.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobManagerImpl.java
@@ -269,7 +269,7 @@ public class JobManagerImpl implements JobManager, 
SyncopeLoader {
             return;
         }
 
-        final Pair<String, Long> conf = 
AuthContextUtils.execWithAuthContext(SyncopeConstants.MASTER_DOMAIN, () -> {
+        Pair<String, Long> conf = 
AuthContextUtils.execWithAuthContext(SyncopeConstants.MASTER_DOMAIN, () -> {
             String notificationJobCronExpression = StringUtils.EMPTY;
 
             Optional<? extends CPlainAttr> notificationJobCronExp = 
confDAO.find("notificationjob.cronExpression");
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/SchedulerShutdown.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/SchedulerShutdown.java
deleted file mode 100644
index 7104f52..0000000
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/SchedulerShutdown.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.provisioning.java.job;
-
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.DisposableBean;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.scheduling.quartz.SchedulerFactoryBean;
-
-/**
- * Clean shutdown for Quartz scheduler.
- */
-public class SchedulerShutdown implements ApplicationContextAware, 
DisposableBean {
-
-    private ApplicationContext ctx;
-
-    @Override
-    public void setApplicationContext(final ApplicationContext ctx) throws 
BeansException {
-        this.ctx = ctx;
-    }
-
-    @Override
-    public void destroy() throws Exception {
-        SchedulerFactoryBean scheduler = 
ctx.getBean(SchedulerFactoryBean.class);
-        scheduler.getScheduler().shutdown();
-    }
-
-}
diff --git a/core/provisioning-java/src/main/resources/provisioning.properties 
b/core/provisioning-java/src/main/resources/provisioning.properties
index 1560432..014bbaa 100644
--- a/core/provisioning-java/src/main/resources/provisioning.properties
+++ b/core/provisioning-java/src/main/resources/provisioning.properties
@@ -14,11 +14,15 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager
diff --git a/core/provisioning-java/src/main/resources/provisioningContext.xml 
b/core/provisioning-java/src/main/resources/provisioningContext.xml
index 13f4d9f..f464c7f 100644
--- a/core/provisioning-java/src/main/resources/provisioningContext.xml
+++ b/core/provisioning-java/src/main/resources/provisioningContext.xml
@@ -32,16 +32,28 @@ under the License.
 
   <!-- Used by AsyncConnectorFacade -->
   <task:annotation-driven executor="asyncConnectorFacadeExecutor"/>
-  <task:executor id="asyncConnectorFacadeExecutor"
-                 pool-size="${asyncConnectorFacadeExecutor.poolSize}"
-                 queue-capacity="${asyncConnectorFacadeExecutor.queueCapacity}"
-                 rejection-policy="ABORT"/>
+  <bean id="asyncConnectorFacadeExecutor" 
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
+    <property name="corePoolSize" 
value="${asyncConnectorFacadeExecutor.corePoolSize}"/>
+    <property name="maxPoolSize" 
value="${asyncConnectorFacadeExecutor.maxPoolSize}"/>
+    <property name="queueCapacity" 
value="${asyncConnectorFacadeExecutor.queueCapacity}"/>
+    <property name="waitForTasksToCompleteOnShutdown" value="true"/>
+    <property name="awaitTerminationSeconds" 
value="${asyncConnectorFacadeExecutor.awaitTerminationSeconds:5}"/>
+    <property name="rejectedExecutionHandler">
+      <bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/>
+    </property>
+  </bean>
 
   <!-- Used by PriorityPropagationTaskExecutor -->
-  <task:executor id="propagationTaskExecutorAsyncExecutor"
-                 pool-size="${propagationTaskExecutorAsyncExecutor.poolSize}"
-                 
queue-capacity="${propagationTaskExecutorAsyncExecutor.queueCapacity}"
-                 rejection-policy="ABORT"/>
+  <bean id="propagationTaskExecutorAsyncExecutor" 
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
+    <property name="corePoolSize" 
value="${propagationTaskExecutorAsyncExecutor.corePoolSize}"/>
+    <property name="maxPoolSize" 
value="${propagationTaskExecutorAsyncExecutor.maxPoolSize}"/>
+    <property name="queueCapacity" 
value="${propagationTaskExecutorAsyncExecutor.queueCapacity}"/>
+    <property name="waitForTasksToCompleteOnShutdown" value="true"/>
+    <property name="awaitTerminationSeconds" 
value="${propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds:5}"/>
+    <property name="rejectedExecutionHandler">
+      <bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/>
+    </property>
+  </bean>
   <bean class="${propagationTaskExecutor}"/>
 
   <bean class="${userProvisioningManager}"/>
@@ -95,7 +107,6 @@ under the License.
       </props>
     </property>
   </bean>
-  <bean 
class="org.apache.syncope.core.provisioning.java.job.SchedulerShutdown"/>
   <bean class="org.apache.syncope.core.provisioning.java.job.JobManagerImpl">
     <property name="disableQuartzInstance" 
value="${quartz.disableInstance:false}"/>
   </bean>
diff --git a/core/rest-cxf/src/main/resources/restCXFContext.xml 
b/core/rest-cxf/src/main/resources/restCXFContext.xml
index 03b8171..9b65fbc 100644
--- a/core/rest-cxf/src/main/resources/restCXFContext.xml
+++ b/core/rest-cxf/src/main/resources/restCXFContext.xml
@@ -27,16 +27,23 @@ under the License.
                            http://cxf.apache.org/jaxrs
                            http://cxf.apache.org/schemas/jaxrs.xsd
                            http://www.springframework.org/schema/context
-                           
http://www.springframework.org/schema/context/spring-context.xsd
-                           http://www.springframework.org/schema/task
-                           
http://www.springframework.org/schema/task/spring-task.xsd";>
+                           
http://www.springframework.org/schema/context/spring-context.xsd";>
 
   <import resource="classpath:META-INF/cxf/cxf.xml"/>
   <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
 
   <context:component-scan 
base-package="org.apache.syncope.core.rest.cxf.service"/>  
 
-  <task:executor id="batchExecutor" pool-size="10"/>
+  <bean id="batchExecutor" 
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
+    <property name="corePoolSize" value="${batchExecutor.corePoolSize:10}"/>
+    <property name="maxPoolSize" value="${batchExecutor.maxPoolSize:10}"/>
+    <property name="queueCapacity" value="${batchExecutor.queueCapacity:0}"/>
+    <property name="waitForTasksToCompleteOnShutdown" value="true"/>
+    <property name="awaitTerminationSeconds" 
value="${batchExecutor.awaitTerminationSeconds:5}"/>
+    <property name="rejectedExecutionHandler">
+      <bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/>
+    </property>
+  </bean>
 
   <bean id="jaxbProvider" 
class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
     <property name="namespacePrefixes">
diff --git a/docker/core/src/main/resources/provisioning.properties.mariadb 
b/docker/core/src/main/resources/provisioning.properties.mariadb
index d09e393..0750c8f 100644
--- a/docker/core/src/main/resources/provisioning.properties.mariadb
+++ b/docker/core/src/main/resources/provisioning.properties.mariadb
@@ -14,11 +14,15 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager
diff --git a/docker/core/src/main/resources/provisioning.properties.mssql 
b/docker/core/src/main/resources/provisioning.properties.mssql
index a7dfcc5..ee93122 100644
--- a/docker/core/src/main/resources/provisioning.properties.mssql
+++ b/docker/core/src/main/resources/provisioning.properties.mssql
@@ -14,11 +14,15 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager
diff --git a/docker/core/src/main/resources/provisioning.properties.myjson 
b/docker/core/src/main/resources/provisioning.properties.myjson
index e160f89..8426275 100644
--- a/docker/core/src/main/resources/provisioning.properties.myjson
+++ b/docker/core/src/main/resources/provisioning.properties.myjson
@@ -14,11 +14,15 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager
diff --git a/docker/core/src/main/resources/provisioning.properties.mysql 
b/docker/core/src/main/resources/provisioning.properties.mysql
index e160f89..8426275 100644
--- a/docker/core/src/main/resources/provisioning.properties.mysql
+++ b/docker/core/src/main/resources/provisioning.properties.mysql
@@ -14,11 +14,15 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager
diff --git a/docker/core/src/main/resources/provisioning.properties.pgjsonb 
b/docker/core/src/main/resources/provisioning.properties.pgjsonb
index 1560432..014bbaa 100644
--- a/docker/core/src/main/resources/provisioning.properties.pgjsonb
+++ b/docker/core/src/main/resources/provisioning.properties.pgjsonb
@@ -14,11 +14,15 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager
diff --git a/docker/core/src/main/resources/provisioning.properties.postgresql 
b/docker/core/src/main/resources/provisioning.properties.postgresql
index 1560432..014bbaa 100644
--- a/docker/core/src/main/resources/provisioning.properties.postgresql
+++ b/docker/core/src/main/resources/provisioning.properties.postgresql
@@ -14,11 +14,15 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager
diff --git 
a/ext/camel/provisioning-camel/src/main/resources/provisioning.properties 
b/ext/camel/provisioning-camel/src/main/resources/provisioning.properties
index 59d55a6..3e922bc 100644
--- a/ext/camel/provisioning-camel/src/main/resources/provisioning.properties
+++ b/ext/camel/provisioning-camel/src/main/resources/provisioning.properties
@@ -16,11 +16,15 @@
 # under the License.
 camel.directory=${conf.directory}
 
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.camel.CamelUserProvisioningManager
diff --git 
a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/support/DomainProcessEngine.java
 
b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/support/DomainProcessEngine.java
index 61c2c31..940518c 100644
--- 
a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/support/DomainProcessEngine.java
+++ 
b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/support/DomainProcessEngine.java
@@ -58,9 +58,7 @@ public class DomainProcessEngine implements ProcessEngine {
 
     @Override
     public void close() {
-        engines.values().forEach(engine -> {
-            engine.close();
-        });
+        engines.values().forEach(ProcessEngine::close);
     }
 
     @Override
diff --git 
a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/support/DomainProcessEngineFactoryBean.java
 
b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/support/DomainProcessEngineFactoryBean.java
index ea19081..8b4af65 100644
--- 
a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/support/DomainProcessEngineFactoryBean.java
+++ 
b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/support/DomainProcessEngineFactoryBean.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.flowable.support;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
+import javax.annotation.PreDestroy;
 import javax.sql.DataSource;
 import org.apache.commons.lang3.StringUtils;
 import org.flowable.engine.ProcessEngine;
@@ -30,7 +31,6 @@ import org.flowable.engine.impl.util.EngineServiceUtil;
 import org.flowable.idm.spring.SpringIdmEngineConfiguration;
 import org.flowable.spring.SpringProcessEngineConfiguration;
 import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.FactoryBean;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
@@ -42,8 +42,7 @@ import 
org.springframework.transaction.PlatformTransactionManager;
  * template for each of the configured Syncope domains.
  */
 @Component
-public class DomainProcessEngineFactoryBean
-        implements FactoryBean<DomainProcessEngine>, DisposableBean, 
ApplicationContextAware {
+public class DomainProcessEngineFactoryBean implements 
FactoryBean<DomainProcessEngine>, ApplicationContextAware {
 
     private ApplicationContext ctx;
 
@@ -105,8 +104,8 @@ public class DomainProcessEngineFactoryBean
         return true;
     }
 
-    @Override
-    public void destroy() throws Exception {
+    @PreDestroy
+    public void preDestroy() {
         if (engine != null) {
             engine.close();
         }
diff --git 
a/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/init/OIDCClientLoader.java
 
b/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/init/OIDCClientLoader.java
index e972305..d2c25e4 100644
--- 
a/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/init/OIDCClientLoader.java
+++ 
b/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/init/OIDCClientLoader.java
@@ -41,8 +41,6 @@ public class OIDCClientLoader implements SyncopeLoader {
     public void load() {
         EntitlementsHolder.getInstance().init(OIDCClientEntitlement.values());
 
-        domainsHolder.getDomains().forEach((domain, datasource) -> {
-            AuthContextUtils.execWithAuthContext(domain, () -> null);
-        });
+        domainsHolder.getDomains().forEach((domain, ds) -> 
AuthContextUtils.execWithAuthContext(domain, () -> null));
     }
 }
diff --git 
a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/init/SAML2SPLoader.java
 
b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/init/SAML2SPLoader.java
index 8c79b69..70a5a78 100644
--- 
a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/init/SAML2SPLoader.java
+++ 
b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/init/SAML2SPLoader.java
@@ -139,18 +139,16 @@ public class SAML2SPLoader implements SyncopeLoader {
             inited = false;
         }
 
-        domainsHolder.getDomains().forEach((domain, datasource) -> {
-            AuthContextUtils.execWithAuthContext(domain, () -> {
-                idpDAO.findAll().forEach(idp -> {
-                    try {
-                        cache.put(idp);
-                    } catch (Exception e) {
-                        LOG.error("Could not cache the SAML 2.0 IdP with key 
", idp.getEntityID(), e);
-                    }
-                });
-                return null;
+        domainsHolder.getDomains().forEach((domain, datasource) -> 
AuthContextUtils.execWithAuthContext(domain, () -> {
+            idpDAO.findAll().forEach(idp -> {
+                try {
+                    cache.put(idp);
+                } catch (Exception e) {
+                    LOG.error("Could not cache the SAML 2.0 IdP with key ", 
idp.getEntityID(), e);
+                }
             });
-        });
+            return null;
+        }));
     }
 
     public boolean isInited() {
diff --git a/fit/core-reference/src/main/resources/all/provisioning.properties 
b/fit/core-reference/src/main/resources/all/provisioning.properties
index f7ce313..d64ed60 100644
--- a/fit/core-reference/src/main/resources/all/provisioning.properties
+++ b/fit/core-reference/src/main/resources/all/provisioning.properties
@@ -16,11 +16,15 @@
 # under the License.
 camel.directory=${conf.directory}
 
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.camel.CamelUserProvisioningManager
diff --git a/fit/core-reference/src/main/resources/jboss/restCXFContext.xml 
b/fit/core-reference/src/main/resources/jboss/restCXFContext.xml
index 49b2fbf..c6355f7 100644
--- a/fit/core-reference/src/main/resources/jboss/restCXFContext.xml
+++ b/fit/core-reference/src/main/resources/jboss/restCXFContext.xml
@@ -27,16 +27,23 @@ under the License.
                            http://cxf.apache.org/jaxrs
                            http://cxf.apache.org/schemas/jaxrs.xsd
                            http://www.springframework.org/schema/context
-                           
http://www.springframework.org/schema/context/spring-context.xsd
-                           http://www.springframework.org/schema/task
-                           
http://www.springframework.org/schema/task/spring-task.xsd";>
+                           
http://www.springframework.org/schema/context/spring-context.xsd";>
 
   <import resource="classpath:META-INF/cxf/cxf.xml"/>
   <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
 
   <context:component-scan 
base-package="org.apache.syncope.core.rest.cxf.service"/>  
 
-  <task:executor id="batchExecutor" pool-size="10"/>
+  <bean id="batchExecutor" 
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
+    <property name="corePoolSize" value="${batchExecutor.corePoolSize:10}"/>
+    <property name="maxPoolSize" value="${batchExecutor.maxPoolSize:10}"/>
+    <property name="queueCapacity" value="${batchExecutor.queueCapacity:0}"/>
+    <property name="waitForTasksToCompleteOnShutdown" value="true"/>
+    <property name="awaitTerminationSeconds" 
value="${batchExecutor.awaitTerminationSeconds:5}"/>
+    <property name="rejectedExecutionHandler">
+      <bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/>
+    </property>
+  </bean>
 
   <bean id="jaxbProvider" 
class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
     <property name="namespacePrefixes">
diff --git 
a/fit/core-reference/src/main/resources/mariadb/provisioning.properties 
b/fit/core-reference/src/main/resources/mariadb/provisioning.properties
index d09e393..0750c8f 100644
--- a/fit/core-reference/src/main/resources/mariadb/provisioning.properties
+++ b/fit/core-reference/src/main/resources/mariadb/provisioning.properties
@@ -14,11 +14,15 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager
diff --git 
a/fit/core-reference/src/main/resources/myjson/provisioning.properties 
b/fit/core-reference/src/main/resources/myjson/provisioning.properties
index e160f89..8426275 100644
--- a/fit/core-reference/src/main/resources/myjson/provisioning.properties
+++ b/fit/core-reference/src/main/resources/myjson/provisioning.properties
@@ -14,11 +14,15 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager
diff --git 
a/fit/core-reference/src/main/resources/mysql/provisioning.properties 
b/fit/core-reference/src/main/resources/mysql/provisioning.properties
index e160f89..8426275 100644
--- a/fit/core-reference/src/main/resources/mysql/provisioning.properties
+++ b/fit/core-reference/src/main/resources/mysql/provisioning.properties
@@ -14,11 +14,15 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager
diff --git 
a/fit/core-reference/src/main/resources/oracle/provisioning.properties 
b/fit/core-reference/src/main/resources/oracle/provisioning.properties
index b51ddfa..357051a 100644
--- a/fit/core-reference/src/main/resources/oracle/provisioning.properties
+++ b/fit/core-reference/src/main/resources/oracle/provisioning.properties
@@ -14,11 +14,15 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager
diff --git 
a/fit/core-reference/src/main/resources/pgjsonb/provisioning.properties 
b/fit/core-reference/src/main/resources/pgjsonb/provisioning.properties
index 48f2252..0c98d39 100644
--- a/fit/core-reference/src/main/resources/pgjsonb/provisioning.properties
+++ b/fit/core-reference/src/main/resources/pgjsonb/provisioning.properties
@@ -14,11 +14,15 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager
diff --git 
a/fit/core-reference/src/main/resources/postgres/provisioning.properties 
b/fit/core-reference/src/main/resources/postgres/provisioning.properties
index 48f2252..0c98d39 100644
--- a/fit/core-reference/src/main/resources/postgres/provisioning.properties
+++ b/fit/core-reference/src/main/resources/postgres/provisioning.properties
@@ -14,11 +14,15 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager
diff --git a/fit/core-reference/src/main/resources/provisioning.properties 
b/fit/core-reference/src/main/resources/provisioning.properties
index 3c48695..fa3a5f0 100644
--- a/fit/core-reference/src/main/resources/provisioning.properties
+++ b/fit/core-reference/src/main/resources/provisioning.properties
@@ -14,11 +14,15 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager
diff --git 
a/fit/core-reference/src/main/resources/sqlserver/provisioning.properties 
b/fit/core-reference/src/main/resources/sqlserver/provisioning.properties
index a7dfcc5..ee93122 100644
--- a/fit/core-reference/src/main/resources/sqlserver/provisioning.properties
+++ b/fit/core-reference/src/main/resources/sqlserver/provisioning.properties
@@ -14,11 +14,15 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-asyncConnectorFacadeExecutor.poolSize=5-25
+asyncConnectorFacadeExecutor.corePoolSize=5
+asyncConnectorFacadeExecutor.maxPoolSize=25
 asyncConnectorFacadeExecutor.queueCapacity=100
+asyncConnectorFacadeExecutor.awaitTerminationSeconds=5
 
-propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.corePoolSize=5
+propagationTaskExecutorAsyncExecutor.maxPoolSize=25
 propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutorAsyncExecutor.awaitTerminationSeconds=5
 
propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 
userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager

Reply via email to