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