@Override protected Object getSequenceNumber() { return this.headerAccessor.getSequenceNumber(); }
@Override public int compare(Message<?> o1, Message<?> o2) { int sequenceNumber1 = new IntegrationMessageHeaderAccessor(o1).getSequenceNumber(); int sequenceNumber2 = new IntegrationMessageHeaderAccessor(o2).getSequenceNumber(); return Integer.compare(sequenceNumber1, sequenceNumber2); }
protected int findLastReleasedSequenceNumber(Object groupId, Collection<Message<?>> partialSequence) { Message<?> lastReleasedMessage = Collections.max(partialSequence, this.sequenceNumberComparator); return new IntegrationMessageHeaderAccessor(lastReleasedMessage).getSequenceNumber(); }
private Integer extractSequenceNumber(Message<?> message) { return new IntegrationMessageHeaderAccessor(message).getSequenceNumber(); } }
public void second(Message<?> message) { int sequenceNumber = new IntegrationMessageHeaderAccessor(message).getSequenceNumber(); LOG.info("Second handling sequence number: " + sequenceNumber + "; Message ID: " + message.getHeaders().getId()); if (sequenceNumber != 2) { success.set(false); } countDownLatch2.countDown(); } }
public void first(Message<?> message) { int sequenceNumber = new IntegrationMessageHeaderAccessor(message).getSequenceNumber(); LOG.info("First handling sequence number: " + sequenceNumber + "; Message ID: " + message.getHeaders().getId()); if (sequenceNumber != 1) { success.set(false); } countDownLatch1.countDown(); }
@Test public void shouldNotReleaseAfterGap() { in.send(message(6, 6)); in.send(message(2, 6)); in.send(message(1, 6)); assertThat(new IntegrationMessageHeaderAccessor(received.poll()).getSequenceNumber(), is(1)); assertThat(new IntegrationMessageHeaderAccessor(received.poll()).getSequenceNumber(), is(2)); received.poll(); received.poll(); in.send(message(5, 6)); assertThat(received.poll(), is(nullValue())); in.send(message(4, 6)); assertThat(received.poll(), is(nullValue())); }
@Test public void splitterParserTestApplySequenceFalse() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "splitterParserTests.xml", this.getClass()); context.start(); DirectChannel inputChannel = context.getBean("noSequenceInput", DirectChannel.class); PollableChannel output = (PollableChannel) context.getBean("output"); inputChannel.send(MessageBuilder.withPayload(Collections.emptyList()).build()); Message<?> message = output.receive(1000); assertThat(new IntegrationMessageHeaderAccessor(message).getSequenceNumber(), is(0)); assertThat(new IntegrationMessageHeaderAccessor(message).getSequenceSize(), is(0)); context.close(); }
@Test public void testMessageHeadersCopiedFromMap() { Map<String, Object> headerMap = new HashMap<String, Object>(); headerMap.put("testAttribute", Integer.valueOf(123)); headerMap.put("testProperty", "foo"); headerMap.put(IntegrationMessageHeaderAccessor.SEQUENCE_SIZE, 42); headerMap.put(IntegrationMessageHeaderAccessor.SEQUENCE_NUMBER, 24); GenericMessage<String> message = new GenericMessage<String>("test", headerMap); assertEquals(123, message.getHeaders().get("testAttribute")); assertEquals("foo", message.getHeaders().get("testProperty", String.class)); assertEquals(42, new IntegrationMessageHeaderAccessor(message).getSequenceSize()); assertEquals(24, new IntegrationMessageHeaderAccessor(message).getSequenceNumber()); }
@Test public void testResequencerRefServiceActivator() { MessageChannel inputChannel = context.getBean("inputChannel", MessageChannel.class); QueueChannel outputChannel = context.getBean("outputChannel", QueueChannel.class); Message<?> message1 = MessageBuilder.withPayload("1").setCorrelationId("A").setSequenceNumber(1).build(); inputChannel.send(message1); message1 = outputChannel.receive(0); assertNotNull(message1); assertEquals(1, new IntegrationMessageHeaderAccessor(message1).getSequenceNumber()); }
@Test public void applySequenceDisabledByDefault() { BroadcastingDispatcher dispatcher = new BroadcastingDispatcher(); final List<Message<?>> messages = Collections.synchronizedList(new ArrayList<Message<?>>()); MessageHandler target1 = new MessageStoringTestEndpoint(messages); MessageHandler target2 = new MessageStoringTestEndpoint(messages); dispatcher.addHandler(target1); dispatcher.addHandler(target2); dispatcher.dispatch(new GenericMessage<String>("test")); assertEquals(2, messages.size()); assertEquals(0, new IntegrationMessageHeaderAccessor(messages.get(0)).getSequenceNumber()); assertEquals(0, new IntegrationMessageHeaderAccessor(messages.get(0)).getSequenceSize()); assertEquals(0, new IntegrationMessageHeaderAccessor(messages.get(1)).getSequenceNumber()); assertEquals(0, new IntegrationMessageHeaderAccessor(messages.get(1)).getSequenceSize()); }
@Test public void testSequenceNumberAsLong() { Message<String> message = MessageBuilder.withPayload("foo") .setHeader(IntegrationMessageHeaderAccessor.SEQUENCE_NUMBER, Long.MAX_VALUE) .build(); @SuppressWarnings("unused") Integer sequenceNumber = new IntegrationMessageHeaderAccessor(message).getSequenceNumber(); }
@Test public void testBasicResequencing() throws InterruptedException { QueueChannel replyChannel = new QueueChannel(); Message<?> message1 = createMessage("123", "ABC", 3, 3, replyChannel); Message<?> message2 = createMessage("456", "ABC", 3, 1, replyChannel); Message<?> message3 = createMessage("789", "ABC", 3, 2, replyChannel); this.resequencer.handleMessage(message1); this.resequencer.handleMessage(message3); this.resequencer.handleMessage(message2); Message<?> reply1 = replyChannel.receive(0); Message<?> reply2 = replyChannel.receive(0); Message<?> reply3 = replyChannel.receive(0); assertNotNull(reply1); assertThat(new IntegrationMessageHeaderAccessor(reply1).getSequenceNumber(), is(1)); assertNotNull(reply2); assertThat(new IntegrationMessageHeaderAccessor(reply2).getSequenceNumber(), is(2)); assertNotNull(reply3); assertThat(new IntegrationMessageHeaderAccessor(reply3).getSequenceNumber(), is(3)); }
@Test public void testResequence() { input.send(createMessage("123", "id1", 3, 1, null)); assertEquals(1, messageGroupStore.getMessageGroup("id1").size()); input.send(createMessage("789", "id1", 3, 3, null)); assertEquals(2, messageGroupStore.getMessageGroup("id1").size()); input.send(createMessage("456", "id1", 3, 2, null)); Message<?> message1 = output.receive(500); Message<?> message2 = output.receive(500); Message<?> message3 = output.receive(500); assertNotNull(message1); assertEquals(1, new IntegrationMessageHeaderAccessor(message1).getSequenceNumber()); assertNotNull(message2); assertEquals(2, new IntegrationMessageHeaderAccessor(message2).getSequenceNumber()); assertNotNull(message3); assertEquals(3, new IntegrationMessageHeaderAccessor(message3).getSequenceNumber()); }
@Test public void spelIteratorSplitter() { this.spelIteratorInput.send(new GenericMessage<String>("a,b,c,d")); Message<?> a = output.receive(0); Message<?> b = output.receive(0); Message<?> c = output.receive(0); Message<?> d = output.receive(0); assertEquals("a", a.getPayload()); assertEquals(1, new IntegrationMessageHeaderAccessor(a).getSequenceNumber()); assertEquals(0, new IntegrationMessageHeaderAccessor(a).getSequenceSize()); assertEquals("b", b.getPayload()); assertEquals(2, new IntegrationMessageHeaderAccessor(b).getSequenceNumber()); assertEquals(0, new IntegrationMessageHeaderAccessor(b).getSequenceSize()); assertEquals("c", c.getPayload()); assertEquals(3, new IntegrationMessageHeaderAccessor(c).getSequenceNumber()); assertEquals(0, new IntegrationMessageHeaderAccessor(c).getSequenceSize()); assertEquals("d", d.getPayload()); assertEquals(4, new IntegrationMessageHeaderAccessor(d).getSequenceNumber()); assertEquals(0, new IntegrationMessageHeaderAccessor(d).getSequenceSize()); assertNull(output.receive(0)); }
@Test public void sequence() { Message<?> originalMessage = new GenericMessage<String>("test"); this.sequenceRouter.send(originalMessage); Message<?> message1 = this.sequenceOut1.receive(1000); Message<?> message2 = this.sequenceOut2.receive(1000); Message<?> message3 = this.sequenceOut3.receive(1000); assertEquals(originalMessage.getHeaders().getId(), new IntegrationMessageHeaderAccessor(message1).getCorrelationId()); assertEquals(originalMessage.getHeaders().getId(), new IntegrationMessageHeaderAccessor(message2).getCorrelationId()); assertEquals(originalMessage.getHeaders().getId(), new IntegrationMessageHeaderAccessor(message3).getCorrelationId()); assertEquals(1, new IntegrationMessageHeaderAccessor(message1).getSequenceNumber()); assertEquals(3, new IntegrationMessageHeaderAccessor(message1).getSequenceSize()); assertEquals(2, new IntegrationMessageHeaderAccessor(message2).getSequenceNumber()); assertEquals(3, new IntegrationMessageHeaderAccessor(message2).getSequenceSize()); assertEquals(3, new IntegrationMessageHeaderAccessor(message3).getSequenceNumber()); assertEquals(3, new IntegrationMessageHeaderAccessor(message3).getSequenceSize()); }
@Test public void testResequencingWithDuplicateMessages() { QueueChannel replyChannel = new QueueChannel(); Message<?> message1 = createMessage("123", "ABC", 3, 3, replyChannel); Message<?> message2 = createMessage("456", "ABC", 3, 1, replyChannel); Message<?> message3 = createMessage("789", "ABC", 3, 2, replyChannel); this.resequencer.handleMessage(message1); this.resequencer.handleMessage(message3); this.resequencer.handleMessage(message3); this.resequencer.handleMessage(message2); Message<?> reply1 = replyChannel.receive(0); Message<?> reply2 = replyChannel.receive(0); Message<?> reply3 = replyChannel.receive(0); assertNotNull(reply1); assertEquals(1, new IntegrationMessageHeaderAccessor(reply1).getSequenceNumber()); assertNotNull(reply2); assertEquals(2, new IntegrationMessageHeaderAccessor(reply2).getSequenceNumber()); assertNotNull(reply3); assertEquals(3, new IntegrationMessageHeaderAccessor(reply3).getSequenceNumber()); }
@Test public void headerForObjectReturnValues() throws Exception { GenericMessage<String> message = new GenericMessage<>("foo.bar"); MethodInvokingSplitter splitter = this.getSplitter("stringToStringArray"); QueueChannel replyChannel = new QueueChannel(); splitter.setOutputChannel(replyChannel); splitter.handleMessage(message); List<Message<?>> replies = replyChannel.clear(); Message<?> reply1 = replies.get(0); assertNotNull(reply1); assertEquals(2, new IntegrationMessageHeaderAccessor(reply1).getSequenceSize()); assertEquals(1, new IntegrationMessageHeaderAccessor(reply1).getSequenceNumber()); assertEquals(message.getHeaders().getId(), new IntegrationMessageHeaderAccessor(reply1).getCorrelationId()); Message<?> reply2 = replies.get(1); assertNotNull(reply2); assertEquals(2, new IntegrationMessageHeaderAccessor(reply2).getSequenceSize()); assertEquals(2, new IntegrationMessageHeaderAccessor(reply2).getSequenceNumber()); assertEquals(message.getHeaders().getId(), new IntegrationMessageHeaderAccessor(reply2).getCorrelationId()); }
@Test public void headerForMessageReturnValues() throws Exception { GenericMessage<String> message = new GenericMessage<>("foo.bar"); MethodInvokingSplitter splitter = this.getSplitter("messageToMessageList"); QueueChannel replyChannel = new QueueChannel(); splitter.setOutputChannel(replyChannel); splitter.handleMessage(message); List<Message<?>> replies = replyChannel.clear(); Message<?> reply1 = replies.get(0); assertNotNull(reply1); assertEquals(2, new IntegrationMessageHeaderAccessor(reply1).getSequenceSize()); assertEquals(1, new IntegrationMessageHeaderAccessor(reply1).getSequenceNumber()); assertEquals(message.getHeaders().getId(), new IntegrationMessageHeaderAccessor(reply1).getCorrelationId()); Message<?> reply2 = replies.get(1); assertNotNull(reply2); assertEquals(2, new IntegrationMessageHeaderAccessor(reply2).getSequenceSize()); assertEquals(2, new IntegrationMessageHeaderAccessor(reply2).getSequenceNumber()); assertEquals(message.getHeaders().getId(), new IntegrationMessageHeaderAccessor(reply2).getCorrelationId()); }
@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); }