File tree Expand file tree Collapse file tree 3 files changed +26
-11
lines changed
impl/core/src/main/java/io/serverlessworkflow/impl Expand file tree Collapse file tree 3 files changed +26
-11
lines changed Original file line number Diff line number Diff line change 17
17
18
18
import java .util .concurrent .ExecutorService ;
19
19
import java .util .concurrent .Executors ;
20
+ import java .util .concurrent .locks .Lock ;
21
+ import java .util .concurrent .locks .ReentrantLock ;
20
22
21
23
public class DefaultExecutorServiceFactory implements ExecutorServiceFactory {
22
24
23
- private static final ExecutorServiceFactory instance = new DefaultExecutorServiceFactory ();
25
+ private ExecutorService service ;
26
+ private Lock serviceLock = new ReentrantLock ();
24
27
25
28
public static ExecutorServiceFactory instance () {
26
- return instance ;
27
- }
28
-
29
- private static class ExecutorServiceHolder {
30
- private static ExecutorService instance = Executors .newCachedThreadPool ();
29
+ return new DefaultExecutorServiceFactory ();
31
30
}
32
31
33
32
@ Override
34
33
public ExecutorService get () {
35
- return ExecutorServiceHolder .instance ;
34
+ try {
35
+ serviceLock .lock ();
36
+ if (service == null ) {
37
+ service = Executors .newCachedThreadPool ();
38
+ }
39
+ } finally {
40
+ serviceLock .unlock ();
41
+ }
42
+ return service ;
36
43
}
37
44
38
45
private DefaultExecutorServiceFactory () {}
46
+
47
+ @ Override
48
+ public void close () {
49
+ if (service != null ) {
50
+ service .shutdown ();
51
+ }
52
+ }
39
53
}
Original file line number Diff line number Diff line change 18
18
import java .util .concurrent .ExecutorService ;
19
19
import java .util .function .Supplier ;
20
20
21
- @ FunctionalInterface
22
- public interface ExecutorServiceFactory extends Supplier <ExecutorService > {}
21
+ public interface ExecutorServiceFactory extends Supplier <ExecutorService >, AutoCloseable {
22
+ void close ();
23
+ }
Original file line number Diff line number Diff line change 39
39
import java .util .ServiceLoader .Provider ;
40
40
import java .util .concurrent .ConcurrentHashMap ;
41
41
import java .util .concurrent .ExecutorService ;
42
- import java .util .concurrent .Executors ;
43
42
import java .util .stream .Collectors ;
44
43
45
44
public class WorkflowApplication implements AutoCloseable {
@@ -137,7 +136,7 @@ public SchemaValidator getValidator(SchemaInline inline) {
137
136
private SchemaValidatorFactory schemaValidatorFactory ;
138
137
private WorkflowPositionFactory positionFactory = () -> new QueueWorkflowPosition ();
139
138
private WorkflowIdFactory idFactory = () -> UlidCreator .getMonotonicUlid ().toString ();
140
- private ExecutorServiceFactory executorFactory = () -> Executors . newCachedThreadPool ();
139
+ private ExecutorServiceFactory executorFactory = DefaultExecutorServiceFactory . instance ();
141
140
private EventConsumer <?, ?> eventConsumer = InMemoryEvents .get ();
142
141
private EventPublisher eventPublisher = InMemoryEvents .get ();
143
142
private RuntimeDescriptorFactory descriptorFactory =
@@ -236,6 +235,7 @@ public WorkflowDefinition workflowDefinition(Workflow workflow) {
236
235
237
236
@ Override
238
237
public void close () {
238
+ executorFactory .close ();
239
239
for (WorkflowDefinition definition : definitions .values ()) {
240
240
definition .close ();
241
241
}
You can’t perform that action at this time.
0 commit comments