|
1 | 1 | /*
|
2 |
| - * Copyright 2002-2019 the original author or authors. |
| 2 | + * Copyright 2002-2020 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.
|
|
17 | 17 | package org.springframework.integration.aggregator;
|
18 | 18 |
|
19 | 19 | import static org.assertj.core.api.Assertions.assertThat;
|
| 20 | +import static org.mockito.Mockito.atLeast; |
| 21 | +import static org.mockito.Mockito.mock; |
20 | 22 | import static org.mockito.Mockito.never;
|
21 | 23 | import static org.mockito.Mockito.spy;
|
22 | 24 | import static org.mockito.Mockito.verify;
|
23 | 25 |
|
24 | 26 | import java.lang.reflect.Method;
|
| 27 | +import java.time.Duration; |
25 | 28 | import java.util.ArrayList;
|
26 | 29 | import java.util.Collection;
|
27 | 30 | import java.util.List;
|
|
31 | 34 | import java.util.concurrent.Executors;
|
32 | 35 | import java.util.concurrent.TimeUnit;
|
33 | 36 |
|
34 |
| -import org.junit.Ignore; |
35 |
| -import org.junit.Test; |
| 37 | +import org.junit.jupiter.api.Disabled; |
| 38 | +import org.junit.jupiter.api.Test; |
36 | 39 |
|
37 | 40 | import org.springframework.beans.DirectFieldAccessor;
|
| 41 | +import org.springframework.beans.factory.BeanFactory; |
38 | 42 | import org.springframework.integration.IntegrationMessageHeaderAccessor;
|
39 | 43 | import org.springframework.integration.channel.QueueChannel;
|
40 | 44 | import org.springframework.integration.store.MessageGroup;
|
|
57 | 61 | */
|
58 | 62 | public class AbstractCorrelatingMessageHandlerTests {
|
59 | 63 |
|
60 |
| - @Test // INT-2751 |
| 64 | + @Test |
61 | 65 | public void testReaperDoesntReapAProcessingGroup() throws Exception {
|
62 | 66 | final MessageGroupStore groupStore = new SimpleMessageStore();
|
63 | 67 | final CountDownLatch waitForSendLatch = new CountDownLatch(1);
|
@@ -147,7 +151,7 @@ protected void afterRelease(MessageGroup group, Collection<Message<?>> completed
|
147 | 151 | exec.shutdownNow();
|
148 | 152 | }
|
149 | 153 |
|
150 |
| - @Test // INT-2833 |
| 154 | + @Test |
151 | 155 | public void testReaperReapsAnEmptyGroup() {
|
152 | 156 | final MessageGroupStore groupStore = new SimpleMessageStore();
|
153 | 157 | AggregatingMessageHandler handler = new AggregatingMessageHandler(group -> group, groupStore);
|
@@ -176,7 +180,7 @@ public void testReaperReapsAnEmptyGroup() {
|
176 | 180 | .isEqualTo(0);
|
177 | 181 | }
|
178 | 182 |
|
179 |
| - @Test // INT-2833 |
| 183 | + @Test |
180 | 184 | public void testReaperReapsAnEmptyGroupAfterConfiguredDelay() throws Exception {
|
181 | 185 | final MessageGroupStore groupStore = new SimpleMessageStore();
|
182 | 186 | AggregatingMessageHandler handler = new AggregatingMessageHandler(group -> group, groupStore);
|
@@ -251,7 +255,7 @@ public void testReapWithChangeInSameMillisecond() throws Exception {
|
251 | 255 | assertThat(payload.size()).isEqualTo(1);
|
252 | 256 | }
|
253 | 257 |
|
254 |
| - @Test /* INT-3216 */ |
| 258 | + @Test |
255 | 259 | public void testDontReapIfAlreadyComplete() throws Exception {
|
256 | 260 | MessageGroupProcessor mgp = new DefaultAggregatingMessageGroupProcessor();
|
257 | 261 | AggregatingMessageHandler handler = new AggregatingMessageHandler(mgp);
|
@@ -384,7 +388,7 @@ public void removeMessageGroup(Object groupId) {
|
384 | 388 | }
|
385 | 389 |
|
386 | 390 | @Test
|
387 |
| - @Ignore("Time sensitive: the empty group might be removed before main thread reaches assertion for size") |
| 391 | + @Disabled("Time sensitive: the empty group might be removed before main thread reaches assertion for size") |
388 | 392 | public void testScheduleRemoveAnEmptyGroupAfterConfiguredDelay() throws Exception {
|
389 | 393 | final MessageGroupStore groupStore = new SimpleMessageStore();
|
390 | 394 | AggregatingMessageHandler handler = new AggregatingMessageHandler(group -> group, groupStore);
|
@@ -430,7 +434,7 @@ public void testScheduleRemoveAnEmptyGroupAfterConfiguredDelay() throws Exceptio
|
430 | 434 | }
|
431 | 435 |
|
432 | 436 | @Test
|
433 |
| - @Ignore("Until 5.2 with new 'owner' feature on groups") |
| 437 | + @Disabled("Until 5.2 with new 'owner' feature on groups") |
434 | 438 | public void testDontReapMessageOfOtherHandler() {
|
435 | 439 | MessageGroupStore groupStore = new SimpleMessageStore();
|
436 | 440 |
|
@@ -484,4 +488,45 @@ public void testNoPopSequenceDetails() {
|
484 | 488 | assertThat(receive.getHeaders().containsKey(IntegrationMessageHeaderAccessor.SEQUENCE_DETAILS)).isTrue();
|
485 | 489 | }
|
486 | 490 |
|
| 491 | + @Test |
| 492 | + public void testPurgeOrphanedGroupsOnStartup() throws InterruptedException { |
| 493 | + MessageGroupStore groupStore = new SimpleMessageStore(); |
| 494 | + AggregatingMessageHandler handler = new AggregatingMessageHandler(group -> group, groupStore); |
| 495 | + handler.setReleaseStrategy(group -> false); |
| 496 | + QueueChannel discardChannel = new QueueChannel(); |
| 497 | + handler.setDiscardChannel(discardChannel); |
| 498 | + handler.setExpireTimeout(1); |
| 499 | + handler.setBeanFactory(mock(BeanFactory.class)); |
| 500 | + handler.afterPropertiesSet(); |
| 501 | + handler.handleMessageInternal(MessageBuilder.withPayload("test").setCorrelationId("test").build()); |
| 502 | + Thread.sleep(100); |
| 503 | + handler.start(); |
| 504 | + Message<?> receive = discardChannel.receive(10000); |
| 505 | + assertThat(receive).isNotNull(); |
| 506 | + assertThat(groupStore.getMessageGroupCount()).isEqualTo(0); |
| 507 | + } |
| 508 | + |
| 509 | + @Test |
| 510 | + public void testPurgeOrphanedGroupsScheduled() { |
| 511 | + MessageGroupStore groupStore = spy(new SimpleMessageStore()); |
| 512 | + AggregatingMessageHandler handler = new AggregatingMessageHandler(group -> group, groupStore); |
| 513 | + handler.setReleaseStrategy(group -> false); |
| 514 | + QueueChannel discardChannel = new QueueChannel(); |
| 515 | + handler.setDiscardChannel(discardChannel); |
| 516 | + handler.setExpireTimeout(100); |
| 517 | + handler.setExpireDuration(Duration.ofMillis(10)); |
| 518 | + handler.setBeanFactory(mock(BeanFactory.class)); |
| 519 | + ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); |
| 520 | + taskScheduler.afterPropertiesSet(); |
| 521 | + handler.setTaskScheduler(taskScheduler); |
| 522 | + handler.afterPropertiesSet(); |
| 523 | + handler.handleMessageInternal(MessageBuilder.withPayload("test").setCorrelationId("test").build()); |
| 524 | + handler.start(); |
| 525 | + Message<?> receive = discardChannel.receive(10000); |
| 526 | + assertThat(receive).isNotNull(); |
| 527 | + assertThat(groupStore.getMessageGroupCount()).isEqualTo(0); |
| 528 | + verify(groupStore, atLeast(2)).expireMessageGroups(100); |
| 529 | + taskScheduler.destroy(); |
| 530 | + } |
| 531 | + |
487 | 532 | }
|
0 commit comments