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