@Test public void testResequencingWithWrongSequenceSizeAndNumber() throws InterruptedException { QueueChannel discardChannel = new QueueChannel(); Message<?> message1 = createMessage("123", "ABC", 2, 4, null); this.resequencer.setSendPartialResultOnExpiry(false); this.resequencer.setDiscardChannel(discardChannel); this.resequencer.handleMessage(message1); // this.resequencer.discardBarrier(this.resequencer.barriers.get("ABC")); Message<?> reply1 = discardChannel.receive(0); // No message has been received - the message has been rejected. assertNull(reply1); }
@Test public void testResequencingWithDiscard() throws InterruptedException { QueueChannel discardChannel = new QueueChannel(); Message<?> message1 = createMessage("123", "ABC", 4, 2, null); Message<?> message2 = createMessage("456", "ABC", 4, 1, null); Message<?> message3 = createMessage("789", "ABC", 4, 4, null); this.resequencer.setSendPartialResultOnExpiry(false); this.resequencer.setDiscardChannel(discardChannel); this.resequencer.handleMessage(message1); this.resequencer.handleMessage(message2); assertEquals(1, store.expireMessageGroups(-10000)); Message<?> reply1 = discardChannel.receive(0); Message<?> reply2 = discardChannel.receive(0); Message<?> reply3 = discardChannel.receive(0); // only messages 1 and 2 should have been received by now assertNotNull(reply1); assertNotNull(reply2); assertNull(reply3); ArrayList<Integer> sequence = new ArrayList<>( Arrays.asList(new IntegrationMessageHeaderAccessor(reply1).getSequenceNumber(), new IntegrationMessageHeaderAccessor(reply2).getSequenceNumber())); Collections.sort(sequence); assertEquals("[1, 2]", sequence.toString()); // Once a group is expired, late messages are discarded immediately by default this.resequencer.handleMessage(message3); reply3 = discardChannel.receive(0); assertNotNull(reply3); }
@Test public void testResequencingWithDifferentSequenceSizes() throws InterruptedException { QueueChannel discardChannel = new QueueChannel(); Message<?> message1 = createMessage("123", "ABC", 4, 2, null); Message<?> message2 = createMessage("456", "ABC", 5, 1, null); this.resequencer.setSendPartialResultOnExpiry(false); this.resequencer.setDiscardChannel(discardChannel); this.resequencer.setReleasePartialSequences(true); // force SequenceSizeReleaseStrategy this.resequencer.handleMessage(message1); this.resequencer.handleMessage(message2); // this.resequencer.discardBarrier(this.resequencer.barriers.get("ABC")); Message<?> discard1 = discardChannel.receive(0); Message<?> discard2 = discardChannel.receive(0); // message2 has been discarded because it came in with the wrong sequence size assertNotNull(discard1); assertEquals(1, new IntegrationMessageHeaderAccessor(discard1).getSequenceNumber()); assertNull(discard2); }
@Test public void testTimeoutDefaultExpiry() throws InterruptedException { this.resequencer.setGroupTimeoutExpression(new SpelExpressionParser().parseExpression("100")); ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.afterPropertiesSet(); this.resequencer.setTaskScheduler(taskScheduler); QueueChannel discardChannel = new QueueChannel(); this.resequencer.setDiscardChannel(discardChannel); QueueChannel replyChannel = new QueueChannel(); this.resequencer.setOutputChannel(replyChannel); Message<?> message3 = createMessage("789", "ABC", 3, 3, null); Message<?> message2 = createMessage("456", "ABC", 3, 2, null); this.resequencer.handleMessage(message3); this.resequencer.handleMessage(message2); Message<?> out1 = replyChannel.receive(10); assertNull(out1); out1 = discardChannel.receive(10000); assertNotNull(out1); Message<?> out2 = discardChannel.receive(10); assertNotNull(out2); Message<?> message1 = createMessage("123", "ABC", 3, 1, null); this.resequencer.handleMessage(message1); Message<?> out3 = discardChannel.receive(0); assertNotNull(out3); }