20
20
import com .agorapulse .worker .Job ;
21
21
import com .agorapulse .worker .JobConfiguration ;
22
22
import io .micronaut .context .BeanContext ;
23
+ import io .micronaut .context .Qualifier ;
23
24
import io .micronaut .inject .qualifiers .Qualifiers ;
24
25
import io .micronaut .scheduling .ScheduledExecutorTaskScheduler ;
25
26
import io .micronaut .scheduling .TaskScheduler ;
26
27
import jakarta .inject .Singleton ;
27
28
28
29
import java .io .Closeable ;
29
- import java .util .List ;
30
+ import java .util .Map ;
30
31
import java .util .Optional ;
31
- import java .util .concurrent .CopyOnWriteArrayList ;
32
+ import java .util .concurrent .ConcurrentHashMap ;
32
33
import java .util .concurrent .ExecutorService ;
33
34
import java .util .concurrent .Executors ;
34
35
import java .util .concurrent .ScheduledExecutorService ;
35
36
36
37
@ Singleton
37
38
public class DefaultExecutorServiceProvider implements ExecutorServiceProvider , Closeable {
38
39
39
- private final List < ExecutorService > createdExecutors = new CopyOnWriteArrayList <>();
40
+ private final Map < String , ExecutorService > createdExecutors = new ConcurrentHashMap <>();
40
41
41
42
private final BeanContext beanContext ;
42
43
@@ -46,7 +47,7 @@ public DefaultExecutorServiceProvider(BeanContext beanContext) {
46
47
47
48
@ Override
48
49
public void close () {
49
- for (ExecutorService executor : createdExecutors ) {
50
+ for (ExecutorService executor : createdExecutors . values () ) {
50
51
executor .shutdown ();
51
52
}
52
53
}
@@ -79,14 +80,23 @@ public TaskScheduler getTaskScheduler(Job job) {
79
80
}
80
81
81
82
private ExecutorService getExecutor (String schedulerName , int fork ) {
83
+ if (createdExecutors .containsKey (schedulerName )) {
84
+ return createdExecutors .get (schedulerName );
85
+ }
86
+
87
+ Qualifier <ExecutorService > byName = Qualifiers .byName (schedulerName );
88
+
82
89
return beanContext
83
- .findBean (ExecutorService .class , Qualifiers .byName (schedulerName ))
90
+ .findBean (ExecutorService .class , byName )
91
+ .filter (ScheduledExecutorService .class ::isInstance )
84
92
.orElseGet (() -> {
85
93
ExecutorService service = Executors .newScheduledThreadPool (fork , new NamedThreadFactory (schedulerName ));
86
94
87
- createdExecutors .add ( service );
95
+ createdExecutors .put ( schedulerName , service );
88
96
89
- beanContext .registerSingleton (ExecutorService .class , service , Qualifiers .byName (schedulerName ));
97
+ if (beanContext .findBean (ExecutorService .class , byName ).isEmpty ()) {
98
+ beanContext .registerSingleton (ExecutorService .class , service , byName );
99
+ }
90
100
91
101
return service ;
92
102
});
0 commit comments