|
1 | 1 | /* |
2 | | - * Copyright 2002-2017 the original author or authors. |
| 2 | + * Copyright 2002-2018 the original author or authors. |
3 | 3 | * |
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | 5 | * you may not use this file except in compliance with the License. |
@@ -96,39 +96,39 @@ public abstract class AbstractCorrelatingMessageHandler extends AbstractMessageP |
96 | 96 |
|
97 | 97 | private final MessageGroupProcessor outputProcessor; |
98 | 98 |
|
99 | | - private volatile MessageGroupStore messageStore; |
| 99 | + private MessageGroupStore messageStore; |
100 | 100 |
|
101 | | - private volatile CorrelationStrategy correlationStrategy; |
| 101 | + private CorrelationStrategy correlationStrategy; |
102 | 102 |
|
103 | | - private volatile ReleaseStrategy releaseStrategy; |
| 103 | + private ReleaseStrategy releaseStrategy; |
104 | 104 |
|
105 | | - private volatile MessageChannel discardChannel; |
| 105 | + private MessageChannel discardChannel; |
106 | 106 |
|
107 | | - private volatile String discardChannelName; |
| 107 | + private String discardChannelName; |
108 | 108 |
|
109 | 109 | private boolean sendPartialResultOnExpiry = false; |
110 | 110 |
|
111 | | - private volatile boolean sequenceAware = false; |
| 111 | + private boolean sequenceAware = false; |
112 | 112 |
|
113 | | - private volatile LockRegistry lockRegistry = new DefaultLockRegistry(); |
| 113 | + private LockRegistry lockRegistry = new DefaultLockRegistry(); |
114 | 114 |
|
115 | 115 | private boolean lockRegistrySet = false; |
116 | 116 |
|
117 | | - private volatile long minimumTimeoutForEmptyGroups; |
| 117 | + private long minimumTimeoutForEmptyGroups; |
118 | 118 |
|
119 | | - private volatile boolean releasePartialSequences; |
| 119 | + private boolean releasePartialSequences; |
120 | 120 |
|
121 | | - private volatile Expression groupTimeoutExpression; |
| 121 | + private Expression groupTimeoutExpression; |
122 | 122 |
|
123 | | - private volatile List<Advice> forceReleaseAdviceChain; |
| 123 | + private List<Advice> forceReleaseAdviceChain; |
124 | 124 |
|
125 | 125 | private MessageGroupProcessor forceReleaseProcessor = new ForceReleaseMessageGroupProcessor(); |
126 | 126 |
|
127 | 127 | private EvaluationContext evaluationContext; |
128 | 128 |
|
129 | | - private volatile ApplicationEventPublisher applicationEventPublisher; |
| 129 | + private ApplicationEventPublisher applicationEventPublisher; |
130 | 130 |
|
131 | | - private volatile boolean expireGroupsUponTimeout = true; |
| 131 | + private boolean expireGroupsUponTimeout = true; |
132 | 132 |
|
133 | 133 | public AbstractCorrelatingMessageHandler(MessageGroupProcessor processor, MessageGroupStore store, |
134 | 134 | CorrelationStrategy correlationStrategy, ReleaseStrategy releaseStrategy) { |
@@ -415,7 +415,7 @@ protected void handleMessageInternal(Message<?> message) throws Exception { |
415 | 415 | if (this.releaseStrategy.canRelease(messageGroup)) { |
416 | 416 | Collection<Message<?>> completedMessages = null; |
417 | 417 | try { |
418 | | - completedMessages = this.completeGroup(message, correlationKey, messageGroup); |
| 418 | + completedMessages = completeGroup(message, correlationKey, messageGroup); |
419 | 419 | } |
420 | 420 | finally { |
421 | 421 | // Always clean up even if there was an exception |
@@ -445,13 +445,15 @@ private void scheduleGroupToForceComplete(MessageGroup messageGroup) { |
445 | 445 | if (groupTimeout != null && groupTimeout >= 0) { |
446 | 446 | if (groupTimeout > 0) { |
447 | 447 | final Object groupId = messageGroup.getGroupId(); |
| 448 | + final long timestamp = messageGroup.getTimestamp(); |
| 449 | + final long lastModified = messageGroup.getLastModified(); |
448 | 450 | ScheduledFuture<?> scheduledFuture = getTaskScheduler() |
449 | 451 | .schedule(new Runnable() { |
450 | 452 |
|
451 | 453 | @Override |
452 | 454 | public void run() { |
453 | 455 | try { |
454 | | - processForceRelease(groupId); |
| 456 | + processForceRelease(groupId, timestamp, lastModified); |
455 | 457 | } |
456 | 458 | catch (MessageDeliveryException e) { |
457 | 459 | if (logger.isWarnEnabled()) { |
@@ -480,9 +482,11 @@ private void scheduleGroupToForceComplete(Object groupId) { |
480 | 482 | scheduleGroupToForceComplete(messageGroup); |
481 | 483 | } |
482 | 484 |
|
483 | | - private void processForceRelease(Object groupId) { |
| 485 | + private void processForceRelease(Object groupId, long timestamp, long lastModified) { |
484 | 486 | MessageGroup messageGroup = this.messageStore.getMessageGroup(groupId); |
485 | | - this.forceReleaseProcessor.processMessageGroup(messageGroup); |
| 487 | + if (messageGroup.getTimestamp() == timestamp && messageGroup.getLastModified() == lastModified) { |
| 488 | + this.forceReleaseProcessor.processMessageGroup(messageGroup); |
| 489 | + } |
486 | 490 | } |
487 | 491 |
|
488 | 492 | private void discardMessage(Message<?> message) { |
@@ -546,9 +550,11 @@ protected void forceComplete(MessageGroup group) { |
546 | 550 | } |
547 | 551 | long lastModifiedNow = groupNow.getLastModified(); |
548 | 552 | int groupSize = groupNow.size(); |
| 553 | + |
549 | 554 | if ((!groupNow.isComplete() || groupSize == 0) |
550 | 555 | && group.getLastModified() == lastModifiedNow |
551 | 556 | && group.getTimestamp() == groupNow.getTimestamp()) { |
| 557 | + |
552 | 558 | if (groupSize > 0) { |
553 | 559 | if (this.releaseStrategy.canRelease(groupNow)) { |
554 | 560 | completeGroup(correlationKey, groupNow); |
|
0 commit comments