@Override protected MessageHandler createDefaultHandler() { return configureSplitter(new DefaultMessageSplitter()); }
/** * Populate the {@link DefaultMessageSplitter} with provided options * to the current integration flow position. * Typically used with a Java 8 Lambda expression: * <pre class="code"> * {@code * .split(s -> s.applySequence(false).delimiters(",")) * } * </pre> * @param endpointConfigurer the {@link Consumer} to provide integration endpoint options * and for {@link DefaultMessageSplitter}. * @return the current {@link IntegrationFlowDefinition}. * @see SplitterEndpointSpec */ public B split(Consumer<SplitterEndpointSpec<DefaultMessageSplitter>> endpointConfigurer) { return split(new DefaultMessageSplitter(), endpointConfigurer); }
@Bean @Splitter(inputChannel = "splitterChannel", applySequence = "false") public MessageHandler splitter() { return new DefaultMessageSplitter(); }
@Bean @Splitter(inputChannel = "splitterChannel") public MessageHandler splitter() { DefaultMessageSplitter defaultMessageSplitter = new DefaultMessageSplitter(); defaultMessageSplitter.setOutputChannelName("serviceChannel"); return defaultMessageSplitter; }
@Bean @Splitter(inputChannel = "splitChannel") public MessageHandler splitter() { DefaultMessageSplitter splitter = new DefaultMessageSplitter(); splitter.setOutputChannelName("toJmsChannel"); return splitter; }
@Test public void splitMessageWithEmptyCollectionPayload() throws Exception { Message<List<String>> message = MessageBuilder.withPayload(Collections.<String>emptyList()).build(); QueueChannel replyChannel = new QueueChannel(); DefaultMessageSplitter splitter = new DefaultMessageSplitter(); splitter.setOutputChannel(replyChannel); splitter.handleMessage(message); Message<?> output = replyChannel.receive(15); assertThat(output, is(nullValue())); }
@Test public void splitMessageWithCollectionPayload() throws Exception { List<String> payload = Arrays.asList("x", "y", "z"); Message<List<String>> message = MessageBuilder.withPayload(payload).build(); QueueChannel replyChannel = new QueueChannel(); DefaultMessageSplitter splitter = new DefaultMessageSplitter(); splitter.setOutputChannel(replyChannel); splitter.handleMessage(message); List<Message<?>> replies = replyChannel.clear(); assertEquals(3, replies.size()); Message<?> reply1 = replies.get(0); assertNotNull(reply1); assertEquals("x", reply1.getPayload()); Message<?> reply2 = replies.get(1); assertNotNull(reply2); assertEquals("y", reply2.getPayload()); Message<?> reply3 = replies.get(2); assertNotNull(reply3); assertEquals("z", reply3.getPayload()); }
@Test public void splitMessageWithArrayPayload() throws Exception { String[] payload = new String[] { "x", "y", "z" }; Message<String[]> message = MessageBuilder.withPayload(payload).build(); QueueChannel replyChannel = new QueueChannel(); DefaultMessageSplitter splitter = new DefaultMessageSplitter(); splitter.setOutputChannel(replyChannel); splitter.handleMessage(message); List<Message<?>> replies = replyChannel.clear(); assertEquals(3, replies.size()); Message<?> reply1 = replies.get(0); assertNotNull(reply1); assertEquals("x", reply1.getPayload()); Message<?> reply2 = replies.get(1); assertNotNull(reply2); assertEquals("y", reply2.getPayload()); Message<?> reply3 = replies.get(2); assertNotNull(reply3); assertEquals("z", reply3.getPayload()); }
@Test public void splitStreamReactive() { Message<?> message = new GenericMessage<>(Stream.of("x", "y", "z")); FluxMessageChannel replyChannel = new FluxMessageChannel(); DefaultMessageSplitter splitter = new DefaultMessageSplitter(); splitter.setOutputChannel(replyChannel); splitter.handleMessage(message); Flux<String> testFlux = Flux.from(replyChannel) .map(Message::getPayload) .cast(String.class); StepVerifier.create(testFlux) .expectNext("x", "y", "z") .then(() -> ((Subscriber<?>) TestUtils.getPropertyValue(replyChannel, "subscribers", List.class).get(0)) .onComplete()) .verifyComplete(); }
@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 splitArrayPayloadReactive() { Message<?> message = new GenericMessage<>(new String[] { "x", "y", "z" }); FluxMessageChannel replyChannel = new FluxMessageChannel(); DefaultMessageSplitter splitter = new DefaultMessageSplitter(); splitter.setOutputChannel(replyChannel); splitter.handleMessage(message); Flux<String> testFlux = Flux.from(replyChannel) .map(Message::getPayload) .cast(String.class); StepVerifier.create(testFlux) .expectNext("x", "y", "z") .then(() -> ((Subscriber<?>) TestUtils.getPropertyValue(replyChannel, "subscribers", List.class).get(0)) .onComplete()) .verifyComplete(); }
@Test public void splitFluxReactive() { Message<?> message = new GenericMessage<>(Flux.just("x", "y", "z")); FluxMessageChannel replyChannel = new FluxMessageChannel(); DefaultMessageSplitter splitter = new DefaultMessageSplitter(); splitter.setOutputChannel(replyChannel); splitter.handleMessage(message); Flux<String> testFlux = Flux.from(replyChannel) .map(Message::getPayload) .cast(String.class); StepVerifier.create(testFlux) .expectNext("x", "y", "z") .then(() -> ((Subscriber<?>) TestUtils.getPropertyValue(replyChannel, "subscribers", List.class).get(0)) .onComplete()) .verifyComplete(); }
@Override protected MessageHandler createDefaultHandler() { return configureSplitter(new DefaultMessageSplitter()); }
@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()); }
/** * Populate the {@link DefaultMessageSplitter} with provided options * to the current integration flow position. * Typically used with a Java 8 Lambda expression: * <pre class="code"> * {@code * .split(s -> s.applySequence(false).get().getT2().setDelimiters(",")) * } * </pre> * @param endpointConfigurer the {@link Consumer} to provide integration endpoint options * and for {@link DefaultMessageSplitter}. * @return the current {@link IntegrationFlowDefinition}. * @see SplitterEndpointSpec */ public B split(Consumer<SplitterEndpointSpec<DefaultMessageSplitter>> endpointConfigurer) { return this.split(new DefaultMessageSplitter(), endpointConfigurer); }
/** * Populate the {@link DefaultMessageSplitter} with provided options * to the current integration flow position. * Typically used with a Java 8 Lambda expression: * <pre class="code"> * {@code * .split(s -> s.applySequence(false).get().getT2().setDelimiters(",")) * } * </pre> * @param endpointConfigurer the {@link Consumer} to provide integration endpoint options * and for {@link DefaultMessageSplitter}. * @return the current {@link IntegrationFlowDefinition}. * @see SplitterEndpointSpec */ public B split(Consumer<SplitterEndpointSpec<DefaultMessageSplitter>> endpointConfigurer) { return this.split(new DefaultMessageSplitter(), endpointConfigurer); }
/** * Populate the {@link DefaultMessageSplitter} with provided options * to the current integration flow position. * Typically used with a Java 8 Lambda expression: * <pre class="code"> * {@code * .split(s -> s.applySequence(false).delimiters(",")) * } * </pre> * @param endpointConfigurer the {@link Consumer} to provide integration endpoint options * and for {@link DefaultMessageSplitter}. * @return the current {@link IntegrationFlowDefinition}. * @see SplitterEndpointSpec */ public B split(Consumer<SplitterEndpointSpec<DefaultMessageSplitter>> endpointConfigurer) { return split(new DefaultMessageSplitter(), endpointConfigurer); }
@Test public void splitFlux() { Message<?> message = new GenericMessage<>( Flux .generate(() -> 0, (state, sink) -> { if (state == 10) { sink.complete(); } else { sink.next(state); } return ++state; })); 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)); }
@Override protected MessageHandler createHandler(Object targetObject, String targetMethodName) { AbstractMessageSplitter splitter = null; if (targetObject == null) { Assert.isTrue(!StringUtils.hasText(targetMethodName), "'method' should only be provided when 'ref' is also provided"); splitter = new DefaultMessageSplitter(); } else if (targetObject instanceof AbstractMessageSplitter) { splitter = (AbstractMessageSplitter) targetObject; } else { splitter = (StringUtils.hasText(targetMethodName)) ? new MethodInvokingSplitter(targetObject, targetMethodName) : new MethodInvokingSplitter(targetObject); } if (this.sendTimeout != null) { splitter.setSendTimeout(this.sendTimeout.longValue()); } return splitter; }
@Override protected AbstractMessageSplitter createHandler() { AbstractMessageSplitter splitterHandler; Expression expression = properties.getExpression(); if (expression != null) { splitterHandler = new ExpressionEvaluatingSplitter(expression); } else { String charset = properties.getCharset(); Boolean markers = properties.getFileMarkers(); if(markers != null || charset != null) { if (markers == null) { markers = false; } FileSplitter splitter = new FileSplitter(true, markers, properties.getMarkersJson()); if (charset != null) { splitter.setCharset(Charset.forName(charset)); } splitterHandler = splitter; } else { DefaultMessageSplitter splitter = new DefaultMessageSplitter(); splitter.setDelimiters(properties.getDelimiters()); splitterHandler = splitter; } } splitterHandler.setOutputChannel(channels.output()); splitterHandler.setApplySequence(properties.isApplySequence()); return splitterHandler; }