INT-3560: Fix DelayHandler for Duplicate Messages
JIRA: https://jira.spring.io/browse/INT-3560 Previously, messages arriving at the delayer before the the context was initialized would be emitted twice after the context `refresh()` or a JMX invocation of `reschedulePersistedMessages()`. When using a `SimpleMessageStore`, the "re" scheduled message from the context refreshed event (or a JMX invocation) would be re-handled unconditionally. This was due to incorrect logic to handle the way the `SMS` stores messages. Change the logic to correctly handle (ignore) duplicate scheduled releases when using `SMS`.
This commit is contained in:
committed by
Gary Russell
parent
41dcd8a453
commit
3d43ad1aa9
@@ -17,7 +17,9 @@
|
||||
package org.springframework.integration.handler;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNotSame;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertSame;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.Mockito.mock;
|
||||
@@ -37,6 +39,7 @@ import org.springframework.context.event.ContextRefreshedEvent;
|
||||
import org.springframework.context.support.StaticApplicationContext;
|
||||
import org.springframework.expression.Expression;
|
||||
import org.springframework.expression.spel.standard.SpelExpressionParser;
|
||||
import org.springframework.integration.channel.QueueChannel;
|
||||
import org.springframework.messaging.MessageHandlingException;
|
||||
import org.springframework.integration.channel.DirectChannel;
|
||||
import org.springframework.integration.channel.MessagePublishingErrorHandler;
|
||||
@@ -437,6 +440,25 @@ public class DelayHandlerTests {
|
||||
this.delayHandler.handleMessage(new GenericMessage<String>("test"));
|
||||
}
|
||||
|
||||
@Test //INT-3560
|
||||
/*
|
||||
It's difficult to test it from real ctx, because any async process from 'inbound-channel-adapter'
|
||||
can't achieve the DelayHandler before the main thread emits 'ContextRefreshedEvent'.
|
||||
*/
|
||||
public void testRescheduleAndHandleAtTheSameTime() throws Exception {
|
||||
QueueChannel results = new QueueChannel();
|
||||
delayHandler.setOutputChannel(results);
|
||||
this.delayHandler.setDefaultDelay(100);
|
||||
startDelayerHandler();
|
||||
|
||||
this.input.send(new GenericMessage<>("foo"));
|
||||
this.delayHandler.reschedulePersistedMessages();
|
||||
Message<?> message = results.receive(10000);
|
||||
assertNotNull(message);
|
||||
message = results.receive(500);
|
||||
assertNull(message);
|
||||
}
|
||||
|
||||
private void waitForLatch(long timeout) {
|
||||
try {
|
||||
this.latch.await(timeout, TimeUnit.MILLISECONDS);
|
||||
|
||||
Reference in New Issue
Block a user