19
19
import java .lang .reflect .Method ;
20
20
import java .util .Collection ;
21
21
import java .util .Collections ;
22
+ import java .util .IdentityHashMap ;
22
23
import java .util .LinkedHashSet ;
23
24
import java .util .Map ;
24
25
import java .util .Set ;
@@ -111,7 +112,7 @@ public class ScheduledAnnotationBeanPostProcessor implements DestructionAwareBea
111
112
112
113
private final Set <Class <?>> nonAnnotatedClasses = Collections .newSetFromMap (new ConcurrentHashMap <>(64 ));
113
114
114
- private final Map <Object , Set <ScheduledTask >> scheduledTasks = new ConcurrentHashMap <>(16 );
115
+ private final Map <Object , Set <ScheduledTask >> scheduledTasks = new IdentityHashMap <>(16 );
115
116
116
117
117
118
@ Override
@@ -261,8 +262,8 @@ public Object postProcessAfterInitialization(final Object bean, String beanName)
261
262
new MethodIntrospector .MetadataLookup <Set <Scheduled >>() {
262
263
@ Override
263
264
public Set <Scheduled > inspect (Method method ) {
264
- Set <Scheduled > scheduledMethods =
265
- AnnotatedElementUtils . getMergedRepeatableAnnotations ( method , Scheduled .class , Schedules .class );
265
+ Set <Scheduled > scheduledMethods = AnnotatedElementUtils . getMergedRepeatableAnnotations (
266
+ method , Scheduled .class , Schedules .class );
266
267
return (!scheduledMethods .isEmpty () ? scheduledMethods : null );
267
268
}
268
269
});
@@ -300,11 +301,7 @@ protected void processScheduled(Scheduled scheduled, Method method, Object bean)
300
301
String errorMessage =
301
302
"Exactly one of the 'cron', 'fixedDelay(String)', or 'fixedRate(String)' attributes is required" ;
302
303
303
- Set <ScheduledTask > tasks = this .scheduledTasks .get (bean );
304
- if (tasks == null ) {
305
- tasks = new LinkedHashSet <>(4 );
306
- this .scheduledTasks .put (bean , tasks );
307
- }
304
+ Set <ScheduledTask > tasks = new LinkedHashSet <>(4 );
308
305
309
306
// Determine initial delay
310
307
long initialDelay = scheduled .initialDelay ();
@@ -398,6 +395,16 @@ protected void processScheduled(Scheduled scheduled, Method method, Object bean)
398
395
399
396
// Check whether we had any attribute set
400
397
Assert .isTrue (processedSchedule , errorMessage );
398
+
399
+ // Finally register the scheduled tasks
400
+ synchronized (this .scheduledTasks ) {
401
+ Set <ScheduledTask > registeredTasks = this .scheduledTasks .get (bean );
402
+ if (registeredTasks == null ) {
403
+ registeredTasks = new LinkedHashSet <>(4 );
404
+ this .scheduledTasks .put (bean , registeredTasks );
405
+ }
406
+ registeredTasks .addAll (tasks );
407
+ }
401
408
}
402
409
catch (IllegalArgumentException ex ) {
403
410
throw new IllegalStateException (
@@ -408,7 +415,10 @@ protected void processScheduled(Scheduled scheduled, Method method, Object bean)
408
415
409
416
@ Override
410
417
public void postProcessBeforeDestruction (Object bean , String beanName ) {
411
- Set <ScheduledTask > tasks = this .scheduledTasks .remove (bean );
418
+ Set <ScheduledTask > tasks ;
419
+ synchronized (this .scheduledTasks ) {
420
+ tasks = this .scheduledTasks .remove (bean );
421
+ }
412
422
if (tasks != null ) {
413
423
for (ScheduledTask task : tasks ) {
414
424
task .cancel ();
@@ -418,18 +428,22 @@ public void postProcessBeforeDestruction(Object bean, String beanName) {
418
428
419
429
@ Override
420
430
public boolean requiresDestruction (Object bean ) {
421
- return this .scheduledTasks .containsKey (bean );
431
+ synchronized (this .scheduledTasks ) {
432
+ return this .scheduledTasks .containsKey (bean );
433
+ }
422
434
}
423
435
424
436
@ Override
425
437
public void destroy () {
426
- Collection <Set <ScheduledTask >> allTasks = this .scheduledTasks .values ();
427
- for (Set <ScheduledTask > tasks : allTasks ) {
428
- for (ScheduledTask task : tasks ) {
429
- task .cancel ();
438
+ synchronized (this .scheduledTasks ) {
439
+ Collection <Set <ScheduledTask >> allTasks = this .scheduledTasks .values ();
440
+ for (Set <ScheduledTask > tasks : allTasks ) {
441
+ for (ScheduledTask task : tasks ) {
442
+ task .cancel ();
443
+ }
430
444
}
445
+ this .scheduledTasks .clear ();
431
446
}
432
- this .scheduledTasks .clear ();
433
447
this .registrar .destroy ();
434
448
}
435
449
0 commit comments