@Test public void testAsyncError() { QueueChannel errorChannel = new QueueChannel(); Message<?> message = MessageBuilder.withPayload("test").setErrorChannel(errorChannel).build(); this.asyncIn.send(message); this.asyncService.future.setException(new RuntimeException("intended")); Message<?> error = errorChannel.receive(0); assertNotNull(error); assertThat(error, instanceOf(ErrorMessage.class)); assertThat(error.getPayload(), instanceOf(MessagingException.class)); assertThat(((MessagingException) error.getPayload()).getCause(), instanceOf(RuntimeException.class)); assertThat(((MessagingException) error.getPayload()).getCause().getMessage(), equalTo("intended")); assertEquals("test", ((MessagingException) error.getPayload()).getFailedMessage().getPayload()); }
@Test public void testReactiveConnectErrorOneWay() { ClientHttpConnector httpConnector = new HttpHandlerConnector((request, response) -> { throw new RuntimeException("Intentional connection error"); }); WebClient webClient = WebClient.builder() .clientConnector(httpConnector) .build(); String destinationUri = "http://www.springsource.org/spring-integration"; WebFluxRequestExecutingMessageHandler reactiveHandler = new WebFluxRequestExecutingMessageHandler(destinationUri, webClient); reactiveHandler.setExpectReply(false); QueueChannel errorChannel = new QueueChannel(); reactiveHandler.handleMessage(MessageBuilder.withPayload("hello, world") .setErrorChannel(errorChannel) .build()); Message<?> errorMessage = errorChannel.receive(10000); assertNotNull(errorMessage); assertThat(errorMessage, instanceOf(ErrorMessage.class)); Throwable throwable = (Throwable) errorMessage.getPayload(); assertThat(throwable.getMessage(), containsString("Intentional connection error")); }
@Test public void errorChannelRetained() { DirectChannel requestChannel = new DirectChannel(); DirectChannel errorChannel = new DirectChannel(); requestChannel.subscribe(new AbstractReplyProducingMessageHandler() { @Override protected Object handleRequestMessage(Message<?> requestMessage) { return requestMessage.getPayload() + "-reply"; } }); MessagingGatewaySupport gateway = new MessagingGatewaySupport() { }; gateway.setRequestChannel(requestChannel); gateway.setBeanFactory(mock(BeanFactory.class)); gateway.afterPropertiesSet(); Message<?> message = MessageBuilder.withPayload("test") .setErrorChannel(errorChannel).build(); Message<?> reply = gateway.sendAndReceiveMessage(message); assertEquals("test-reply", reply.getPayload()); assertEquals(errorChannel, reply.getHeaders().getErrorChannel()); }
@Test public void errorChannelHeaderAndHandlerThrowsExceptionWithDelay() { this.delayHandler.setRetryDelay(1); DirectChannel errorChannel = new DirectChannel(); MessagePublishingErrorHandler errorHandler = new MessagePublishingErrorHandler(); errorHandler.setDefaultErrorChannel(errorChannel); taskScheduler.setErrorHandler(errorHandler); this.setDelayExpression(); startDelayerHandler(); output.unsubscribe(resultHandler); errorChannel.subscribe(resultHandler); output.subscribe(message -> { throw new UnsupportedOperationException("intentional test failure"); }); Message<?> message = MessageBuilder.withPayload("test") .setHeader("delay", "10") .setErrorChannel(errorChannel).build(); input.send(message); waitForLatch(10000); Message<?> errorMessage = resultHandler.lastMessage; assertEquals(MessageDeliveryException.class, errorMessage.getPayload().getClass()); MessageDeliveryException exceptionPayload = (MessageDeliveryException) errorMessage.getPayload(); assertSame(message.getPayload(), exceptionPayload.getFailedMessage().getPayload()); assertEquals(UnsupportedOperationException.class, exceptionPayload.getCause().getClass()); assertNotSame(Thread.currentThread(), resultHandler.lastThread); }
@Test public void testReactiveErrorOneWay() { ClientHttpConnector httpConnector = new HttpHandlerConnector((request, response) -> { response.setStatusCode(HttpStatus.UNAUTHORIZED); return Mono.defer(response::setComplete); }); WebClient webClient = WebClient.builder() .clientConnector(httpConnector) .build(); String destinationUri = "http://www.springsource.org/spring-integration"; WebFluxRequestExecutingMessageHandler reactiveHandler = new WebFluxRequestExecutingMessageHandler(destinationUri, webClient); reactiveHandler.setExpectReply(false); QueueChannel errorChannel = new QueueChannel(); reactiveHandler.handleMessage(MessageBuilder.withPayload("hello, world") .setErrorChannel(errorChannel) .build()); Message<?> errorMessage = errorChannel.receive(10000); assertNotNull(errorMessage); assertThat(errorMessage, instanceOf(ErrorMessage.class)); Throwable throwable = (Throwable) errorMessage.getPayload(); assertThat(throwable.getMessage(), containsString("401 Unauthorized")); }
.setErrorChannel(errorChannel) .build();
gateway.start(); Message<?> message = MessageBuilder.withPayload("foo").setErrorChannel(errorChannel).build(); message = MessageBuilder.withPayload("bar").setErrorChannel(errorChannel).build(); gateway.handleMessage(message); assertTrue(replyTimeoutLatch.await(10, TimeUnit.SECONDS)); message = MessageBuilder.withPayload("baz").setErrorChannel(errorChannel).build(); gateway.handleMessage(message); }); gateway.setOutputChannel(errorForce); message = MessageBuilder.withPayload("qux").setErrorChannel(errorChannel).build(); gateway.handleMessage(message); received = errorChannel.receive(10000); message = MessageBuilder.withPayload("fiz").setErrorChannel(errorChannel).build(); gateway.handleMessage(message); Message<?> returned = returnChannel.receive(10000); new DirectFieldAccessor(gateway).setPropertyValue("template", asyncTemplate); message = MessageBuilder.withPayload("buz").setErrorChannel(errorChannel).build(); gateway.handleMessage(message);
messageBuilder.setErrorChannel(getErrorChannel());