Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Commit 1a57636

Browse files
author
Rob Rudin
committed
#44 Ensuring that the task executor waits for all tasks to complete
1 parent af07a23 commit 1a57636

File tree

2 files changed

+26
-38
lines changed

2 files changed

+26
-38
lines changed

src/main/java/com/marklogic/client/batch/BatchWriterSupport.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,11 @@ protected void initializeDefaultTaskExecutor() {
4949
}
5050
ThreadPoolTaskExecutor tpte = new ThreadPoolTaskExecutor();
5151
tpte.setCorePoolSize(threadCount);
52+
5253
// By default, wait for tasks to finish, and wait up to an hour
5354
tpte.setWaitForTasksToCompleteOnShutdown(true);
5455
tpte.setAwaitTerminationSeconds(60 * 60);
56+
5557
tpte.afterPropertiesSet();
5658
this.taskExecutor = tpte;
5759
} else {

src/main/java/com/marklogic/client/modulesloader/impl/DefaultModulesLoader.java

Lines changed: 24 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,30 @@
11
package com.marklogic.client.modulesloader.impl;
22

3-
import java.io.File;
4-
import java.io.IOException;
5-
import java.util.*;
6-
import java.util.concurrent.Future;
7-
import java.util.concurrent.TimeUnit;
8-
9-
import com.marklogic.client.io.marker.QueryOptionsWriteHandle;
10-
import org.springframework.beans.factory.DisposableBean;
11-
import org.springframework.core.io.FileSystemResource;
12-
import org.springframework.core.io.Resource;
13-
import org.springframework.core.task.AsyncTaskExecutor;
14-
import org.springframework.core.task.SimpleAsyncTaskExecutor;
15-
import org.springframework.core.task.SyncTaskExecutor;
16-
import org.springframework.core.task.TaskExecutor;
17-
import org.springframework.scheduling.concurrent.ExecutorConfigurationSupport;
18-
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
19-
import org.springframework.util.FileCopyUtils;
20-
213
import com.fasterxml.jackson.databind.JsonNode;
224
import com.fasterxml.jackson.databind.ObjectMapper;
235
import com.marklogic.client.DatabaseClient;
24-
import com.marklogic.client.admin.ExtensionLibrariesManager;
25-
import com.marklogic.client.admin.ExtensionMetadata;
26-
import com.marklogic.client.admin.NamespacesManager;
27-
import com.marklogic.client.admin.QueryOptionsManager;
28-
import com.marklogic.client.admin.ResourceExtensionsManager;
6+
import com.marklogic.client.admin.*;
297
import com.marklogic.client.admin.ResourceExtensionsManager.MethodParameters;
30-
import com.marklogic.client.admin.ServerConfigurationManager;
318
import com.marklogic.client.admin.ServerConfigurationManager.UpdatePolicy;
32-
import com.marklogic.client.admin.TransformExtensionsManager;
339
import com.marklogic.client.helper.FilenameUtil;
3410
import com.marklogic.client.helper.LoggingObject;
3511
import com.marklogic.client.io.Format;
3612
import com.marklogic.client.io.InputStreamHandle;
37-
import com.marklogic.client.modulesloader.ExtensionMetadataAndParams;
38-
import com.marklogic.client.modulesloader.ExtensionMetadataProvider;
39-
import com.marklogic.client.modulesloader.Modules;
40-
import com.marklogic.client.modulesloader.ModulesFinder;
41-
import com.marklogic.client.modulesloader.ModulesLoader;
42-
import com.marklogic.client.modulesloader.ModulesManager;
13+
import com.marklogic.client.modulesloader.*;
14+
import org.springframework.beans.factory.DisposableBean;
15+
import org.springframework.core.io.FileSystemResource;
16+
import org.springframework.core.io.Resource;
17+
import org.springframework.core.task.SyncTaskExecutor;
18+
import org.springframework.core.task.TaskExecutor;
19+
import org.springframework.scheduling.concurrent.ExecutorConfigurationSupport;
20+
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
21+
import org.springframework.util.FileCopyUtils;
22+
23+
import java.io.File;
24+
import java.io.IOException;
25+
import java.util.*;
26+
import java.util.concurrent.Future;
27+
import java.util.concurrent.TimeUnit;
4328

4429
/**
4530
* Default implementation of ModulesLoader. Loads everything except assets via the REST API. Assets are either loaded
@@ -101,6 +86,11 @@ protected void initializeDefaultTaskExecutor() {
10186
if (taskThreadCount > 1) {
10287
ThreadPoolTaskExecutor tpte = new ThreadPoolTaskExecutor();
10388
tpte.setCorePoolSize(taskThreadCount);
89+
90+
// 10 minutes should be plenty of time to wait for REST API modules to be loaded
91+
tpte.setAwaitTerminationSeconds(60 * 10);
92+
tpte.setWaitForTasksToCompleteOnShutdown(true);
93+
10494
tpte.afterPropertiesSet();
10595
this.taskExecutor = tpte;
10696
} else {
@@ -551,17 +541,13 @@ public void run() {
551541
}
552542

553543
/**
554-
* Ensures that if we're using an AsyncTaskExecutor, we capture the Future and add it to our list so we can ensure
555-
* we wait for it to finish.
544+
* Protected in case a subclass wants to execute the Runnable in a different way - e.g. capturing the Future
545+
* that could be returned.
556546
*
557547
* @param r
558548
*/
559549
protected void executeTask(Runnable r) {
560-
if (taskExecutor instanceof AsyncTaskExecutor) {
561-
taskFutures.add(((AsyncTaskExecutor)taskExecutor).submit(r));
562-
} else {
563-
taskExecutor.execute(r);
564-
}
550+
taskExecutor.execute(r);
565551
}
566552

567553
public File installNamespace(File f) {

0 commit comments

Comments
 (0)