@Override @Nullable protected Object getCorrelationId() { return this.headerAccessor.getCorrelationId(); }
@Aggregator(inputChannel = "inputChannel") public Message<?> aggregatingMethod(List<Message<?>> messages) { List<Message<?>> sortableList = new ArrayList<>(messages); Collections.sort(sortableList, new MessageSequenceComparator()); StringBuffer buffer = new StringBuffer(); Object correlationId = null; for (Message<?> message : sortableList) { buffer.append(message.getPayload().toString()); if (null == correlationId) { correlationId = new IntegrationMessageHeaderAccessor(message).getCorrelationId(); } } Message<?> returnedMessage = new GenericMessage<>(buffer.toString()); this.aggregatedMessages.put(correlationId, returnedMessage); return returnedMessage; }
@org.springframework.integration.annotation.CorrelationStrategy public Object correlate(Message<?> m) { return new IntegrationMessageHeaderAccessor(m).getCorrelationId(); }
@Aggregator(inputChannel = "inputChannel") public Message<?> aggregatingMethod(List<Message<?>> messages) { List<Message<?>> sortableList = new ArrayList<>(messages); Collections.sort(sortableList, new MessageSequenceComparator()); StringBuffer buffer = new StringBuffer(); Object correlationId = null; for (Message<?> message : sortableList) { buffer.append(message.getPayload().toString()); if (null == correlationId) { correlationId = new IntegrationMessageHeaderAccessor(message).getCorrelationId(); } } Message<?> returnedMessage = new GenericMessage<>(buffer.toString()); this.aggregatedMessages.put(correlationId, returnedMessage); return returnedMessage; }
@Test public void correlationIdValueWithType() { MessagingTemplate template = new MessagingTemplate(); MessageChannel channel = context.getBean("correlationIdValueWithTypeInput", MessageChannel.class); Message<?> result = template.sendAndReceive(channel, new GenericMessage<>("test")); assertNotNull(result); Object correlationId = new IntegrationMessageHeaderAccessor(result).getCorrelationId(); assertEquals(Long.class, correlationId.getClass()); assertEquals(123L, correlationId); }
@Test public void chainWithHeaderEnricher() { Message<?> message = MessageBuilder.withPayload(123).build(); this.headerEnricherInput.send(message); Message<?> reply = this.replyOutput.receive(1000); assertNotNull(reply); assertEquals("foo", reply.getPayload()); assertEquals("ABC", new IntegrationMessageHeaderAccessor(reply).getCorrelationId()); assertEquals("XYZ", reply.getHeaders().get("testValue")); assertEquals(123, reply.getHeaders().get("testRef")); }
@Test public void correlationIdRef() { MessagingTemplate template = new MessagingTemplate(); MessageChannel channel = context.getBean("correlationIdRefInput", MessageChannel.class); Message<?> result = template.sendAndReceive(channel, new GenericMessage<>("test")); assertNotNull(result); assertEquals(123, new IntegrationMessageHeaderAccessor(result).getCorrelationId()); }
@Test public void correlationIdValue() { MessagingTemplate template = new MessagingTemplate(); MessageChannel channel = context.getBean("correlationIdValueInput", MessageChannel.class); Message<?> result = template.sendAndReceive(channel, new GenericMessage<>("test")); assertNotNull(result); assertEquals("ABC", new IntegrationMessageHeaderAccessor(result).getCorrelationId()); }
@Test public void testCorrelationIdWithSplitterWhenNotValueSetOnIncomingMessage() throws Exception { Message<?> message = new GenericMessage<String>("test1,test2"); QueueChannel testChannel = new QueueChannel(); MethodInvokingSplitter splitter = new MethodInvokingSplitter( new TestBean(), TestBean.class.getMethod("split", String.class)); splitter.setOutputChannel(testChannel); splitter.setBeanFactory(mock(BeanFactory.class)); splitter.afterPropertiesSet(); splitter.handleMessage(message); Message<?> reply1 = testChannel.receive(100); Message<?> reply2 = testChannel.receive(100); assertEquals(message.getHeaders().getId(), new IntegrationMessageHeaderAccessor(reply1).getCorrelationId()); assertEquals(message.getHeaders().getId(), new IntegrationMessageHeaderAccessor(reply2).getCorrelationId()); }
@Test @Transactional public void testAddAndUpdate() throws Exception { Message<String> message = MessageBuilder.withPayload("foo").setCorrelationId("X").build(); message = messageStore.addMessage(message); message = MessageBuilder.fromMessage(message).setCorrelationId("Y").build(); message = messageStore.addMessage(message); assertEquals("Y", new IntegrationMessageHeaderAccessor(messageStore.getMessage(message.getHeaders().getId())).getCorrelationId()); }
@Test public void splitStream() { Message<?> message = new GenericMessage<>( Stream.generate(Math::random) .limit(10)); QueueChannel outputChannel = new QueueChannel(); DefaultMessageSplitter splitter = new DefaultMessageSplitter(); splitter.setOutputChannel(outputChannel); splitter.handleMessage(message); for (int i = 0; i < 10; i++) { Message<?> reply = outputChannel.receive(0); assertEquals(message.getHeaders().getId(), new IntegrationMessageHeaderAccessor(reply).getCorrelationId()); } assertNull(outputChannel.receive(10)); }
@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 testAddAndUpdate() throws Exception { Message<?> message = MessageBuilder.withPayload("foo").setCorrelationId("X").build(); message = messageStore.addMessage(message); message = MessageBuilder.fromMessage(message).setCorrelationId("Y").build(); message = messageStore.addMessage(message); message = messageStore.getMessage(message.getHeaders().getId()); assertEquals("Y", new IntegrationMessageHeaderAccessor(message).getCorrelationId()); }
@Test public void testCorrelationIdCopiedFromMessageCorrelationIdIfAvailable() { Message<String> message = MessageBuilder.withPayload("test") .setCorrelationId("correlationId").build(); DirectChannel inputChannel = new DirectChannel(); QueueChannel outputChannel = new QueueChannel(1); ServiceActivatingHandler serviceActivator = new ServiceActivatingHandler(new TestBean(), "upperCase"); serviceActivator.setOutputChannel(outputChannel); serviceActivator.setBeanFactory(mock(BeanFactory.class)); serviceActivator.afterPropertiesSet(); EventDrivenConsumer endpoint = new EventDrivenConsumer(inputChannel, serviceActivator); endpoint.start(); assertTrue(inputChannel.send(message)); Message<?> reply = outputChannel.receive(0); assertEquals(new IntegrationMessageHeaderAccessor(message).getCorrelationId(), new IntegrationMessageHeaderAccessor(reply).getCorrelationId()); }
@Test // INT-1082 public void headerAnnotationWithPrefixedHeader() { Object target = new TestTransformer(); MethodInvokingTransformer transformer = new MethodInvokingTransformer(target, "appendCorrelationId"); MessageTransformingHandler handler = new MessageTransformingHandler(transformer); handler.setBeanFactory(mock(BeanFactory.class)); handler.afterPropertiesSet(); QueueChannel outputChannel = new QueueChannel(); handler.setOutputChannel(outputChannel); handler.handleMessage(MessageBuilder.withPayload("test").setCorrelationId("abc").build()); Message<?> result = outputChannel.receive(0); assertNotNull(result); assertEquals("testabc", result.getPayload()); assertEquals("abc", new IntegrationMessageHeaderAccessor(result).getCorrelationId()); }
@Test // INT-1082 public void headerAnnotationWithPrefixedHeaderAndRelativeExpression() { Object target = new TestTransformer(); MethodInvokingTransformer transformer = new MethodInvokingTransformer(target, "evalCorrelationId"); MessageTransformingHandler handler = new MessageTransformingHandler(transformer); handler.setBeanFactory(mock(BeanFactory.class)); handler.afterPropertiesSet(); QueueChannel outputChannel = new QueueChannel(); handler.setOutputChannel(outputChannel); handler.handleMessage(MessageBuilder.withPayload("test").setCorrelationId("abc").build()); Message<?> result = outputChannel.receive(0); assertNotNull(result); assertEquals("ABC", result.getPayload()); assertEquals("abc", new IntegrationMessageHeaderAccessor(result).getCorrelationId()); }
@Test public void correlationIdCopiedFromMessageId() { Message<String> message = MessageBuilder.withPayload("test").build(); DirectChannel inputChannel = new DirectChannel(); QueueChannel outputChannel = new QueueChannel(1); DefaultMessageSplitter splitter = new DefaultMessageSplitter(); splitter.setOutputChannel(outputChannel); EventDrivenConsumer endpoint = new EventDrivenConsumer(inputChannel, splitter); endpoint.start(); assertTrue(inputChannel.send(message)); Message<?> reply = outputChannel.receive(0); assertEquals(message.getHeaders().getId(), new IntegrationMessageHeaderAccessor(reply).getCorrelationId()); }
@Test public void testCorrelationNotCopiedFromRequestMessgeIdIfAlreadySetByHandler() throws Exception { Message<?> message = new GenericMessage<String>("test"); DirectChannel inputChannel = new DirectChannel(); QueueChannel outputChannel = new QueueChannel(1); ServiceActivatingHandler serviceActivator = new ServiceActivatingHandler(new TestBean(), "createMessage"); serviceActivator.setOutputChannel(outputChannel); serviceActivator.setBeanFactory(mock(BeanFactory.class)); serviceActivator.afterPropertiesSet(); EventDrivenConsumer endpoint = new EventDrivenConsumer(inputChannel, serviceActivator); endpoint.start(); assertTrue(inputChannel.send(message)); Message<?> reply = outputChannel.receive(0); assertEquals("456-XYZ", new IntegrationMessageHeaderAccessor(reply).getCorrelationId()); }
@Test public void testCorrelationIdPassedIfAvailable() { Object correlationId = "123-ABC"; Message<String> message = MessageBuilder.withPayload("test") .setCorrelationId(correlationId).build(); DirectChannel inputChannel = new DirectChannel(); QueueChannel outputChannel = new QueueChannel(1); ServiceActivatingHandler serviceActivator = new ServiceActivatingHandler(new TestBean(), "upperCase"); serviceActivator.setOutputChannel(outputChannel); serviceActivator.setBeanFactory(mock(BeanFactory.class)); serviceActivator.afterPropertiesSet(); EventDrivenConsumer endpoint = new EventDrivenConsumer(inputChannel, serviceActivator); endpoint.start(); assertTrue(inputChannel.send(message)); Message<?> reply = outputChannel.receive(0); assertEquals(correlationId, new IntegrationMessageHeaderAccessor(reply).getCorrelationId()); }
@Test public void testCorrelationNotPassedFromRequestHeaderIfAlreadySetByHandler() { Object correlationId = "123-ABC"; Message<String> message = MessageBuilder.withPayload("test") .setCorrelationId(correlationId).build(); DirectChannel inputChannel = new DirectChannel(); QueueChannel outputChannel = new QueueChannel(1); ServiceActivatingHandler serviceActivator = new ServiceActivatingHandler(new TestBean(), "createMessage"); serviceActivator.setOutputChannel(outputChannel); serviceActivator.setBeanFactory(mock(BeanFactory.class)); serviceActivator.afterPropertiesSet(); EventDrivenConsumer endpoint = new EventDrivenConsumer(inputChannel, serviceActivator); endpoint.start(); assertTrue(inputChannel.send(message)); Message<?> reply = outputChannel.receive(0); assertEquals("456-XYZ", new IntegrationMessageHeaderAccessor(reply).getCorrelationId()); }