@Test public void testRequestReplyExchanger() { RequestReplyExchanger testBean = request -> request; final Message<?> test = new GenericMessage<Object>("foo"); ServiceActivatingHandler serviceActivator = new ServiceActivatingHandler(testBean) { @Override protected Object handleRequestMessage(Message<?> message) { Object o = super.handleRequestMessage(message); assertSame(test, o); return null; } }; serviceActivator.setBeanFactory(mock(BeanFactory.class)); serviceActivator.afterPropertiesSet(); serviceActivator.handleMessage(test); }
@Test(expected = MessagingException.class) public void noReplyTarget() { ServiceActivatingHandler endpoint = this.createEndpoint(); Message<?> message = MessageBuilder.withPayload("foo").build(); endpoint.handleMessage(message); }
@Test public void testNioSingle() throws Exception { AbstractServerConnectionFactory scf = new TcpNioServerConnectionFactory(0); scf.setSingleUse(true); TcpInboundGateway gateway = new TcpInboundGateway(); gateway.setConnectionFactory(scf); scf.start(); TestingUtilities.waitListening(scf, 20000L); int port = scf.getPort(); final QueueChannel channel = new QueueChannel(); gateway.setRequestChannel(channel); gateway.setBeanFactory(mock(BeanFactory.class)); ServiceActivatingHandler handler = new ServiceActivatingHandler(new Service()); handler.setChannelResolver(channelName -> channel); handler.setBeanFactory(mock(BeanFactory.class)); handler.afterPropertiesSet(); Socket socket1 = SocketFactory.getDefault().createSocket("localhost", port); socket1.getOutputStream().write("Test1\r\n".getBytes()); Socket socket2 = SocketFactory.getDefault().createSocket("localhost", port); socket2.getOutputStream().write("Test2\r\n".getBytes()); handler.handleMessage(channel.receive(10000)); handler.handleMessage(channel.receive(10000)); byte[] bytes = new byte[12]; readFully(socket1.getInputStream(), bytes); assertEquals("Echo:Test1\r\n", new String(bytes)); readFully(socket2.getInputStream(), bytes); assertEquals("Echo:Test2\r\n", new String(bytes)); gateway.stop(); scf.stop(); }
@Test /* * A handler and message handler fallback (RRE); don't force RRE */ public void testRequestReplyExchangerSeveralMethods() { RequestReplyExchanger testBean = new RequestReplyExchanger() { @Override public Message<?> exchange(Message<?> request) { return request; } @SuppressWarnings("unused") public String foo(String request) { return request.toUpperCase(); } }; ServiceActivatingHandler serviceActivator = new ServiceActivatingHandler(testBean); PollableChannel outputChannel = new QueueChannel(); serviceActivator.setOutputChannel(outputChannel); serviceActivator.setBeanFactory(mock(BeanFactory.class)); serviceActivator.afterPropertiesSet(); Message<?> test = new GenericMessage<Object>(new Date()); serviceActivator.handleMessage(test); assertEquals(test, outputChannel.receive(10)); test = new GenericMessage<Object>("foo"); serviceActivator.handleMessage(test); assertEquals("FOO", outputChannel.receive(10).getPayload()); }
@Test public void testNetSingle() throws Exception { AbstractServerConnectionFactory scf = new TcpNetServerConnectionFactory(0); scf.setSingleUse(true); TcpInboundGateway gateway = new TcpInboundGateway(); gateway.setConnectionFactory(scf); gateway.setBeanFactory(mock(BeanFactory.class)); scf.start(); TestingUtilities.waitListening(scf, 20000L); int port = scf.getPort(); final QueueChannel channel = new QueueChannel(); gateway.setRequestChannel(channel); ServiceActivatingHandler handler = new ServiceActivatingHandler(new Service()); handler.setChannelResolver(channelName -> channel); handler.setBeanFactory(mock(BeanFactory.class)); handler.afterPropertiesSet(); Socket socket1 = SocketFactory.getDefault().createSocket("localhost", port); socket1.getOutputStream().write("Test1\r\n".getBytes()); Socket socket2 = SocketFactory.getDefault().createSocket("localhost", port); socket2.getOutputStream().write("Test2\r\n".getBytes()); handler.handleMessage(channel.receive(10000)); handler.handleMessage(channel.receive(10000)); byte[] bytes = new byte[12]; readFully(socket1.getInputStream(), bytes); assertEquals("Echo:Test1\r\n", new String(bytes)); readFully(socket2.getInputStream(), bytes); assertEquals("Echo:Test2\r\n", new String(bytes)); gateway.stop(); scf.stop(); }
@Test /* * No handler fallback methods; don't force RRE */ public void testRequestReplyExchangerWithGenericMessageMethod() { RequestReplyExchanger testBean = new RequestReplyExchanger() { @Override public Message<?> exchange(Message<?> request) { return request; } @SuppressWarnings("unused") public String foo(Message<String> request) { return request.getPayload().toUpperCase(); } }; ServiceActivatingHandler serviceActivator = new ServiceActivatingHandler(testBean); PollableChannel outputChannel = new QueueChannel(); serviceActivator.setOutputChannel(outputChannel); serviceActivator.setBeanFactory(mock(BeanFactory.class)); serviceActivator.afterPropertiesSet(); Message<?> test = new GenericMessage<Object>(new Date()); serviceActivator.handleMessage(test); assertEquals(test, outputChannel.receive(10)); test = new GenericMessage<Object>("foo"); serviceActivator.handleMessage(test); assertEquals("FOO", outputChannel.receive(10).getPayload()); }
@Test public void singlePublicMethodMatches() { SinglePublicMethodTestBean testBean = new SinglePublicMethodTestBean(); ServiceActivatingHandler serviceActivator = new ServiceActivatingHandler(testBean); QueueChannel outputChannel = new QueueChannel(); serviceActivator.setOutputChannel(outputChannel); serviceActivator.setBeanFactory(mock(BeanFactory.class)); serviceActivator.afterPropertiesSet(); serviceActivator.handleMessage(new GenericMessage<>("foo")); Message<?> result = outputChannel.receive(0); assertEquals("FOO", result.getPayload()); }
serviceActivator.handleMessage(test); assertEquals(test, outputChannel.receive(10)); serviceActivator.handleMessage(test); assertNotEquals("FOO", outputChannel.receive(10).getPayload());
@Test public void singleAnnotationMatches() { SingleAnnotationTestBean testBean = new SingleAnnotationTestBean(); ServiceActivatingHandler serviceActivator = new ServiceActivatingHandler(testBean); QueueChannel outputChannel = new QueueChannel(); serviceActivator.setOutputChannel(outputChannel); serviceActivator.setBeanFactory(mock(BeanFactory.class)); serviceActivator.afterPropertiesSet(); serviceActivator.handleMessage(new GenericMessage<>("foo")); Message<?> result = outputChannel.receive(0); assertEquals("FOO", result.getPayload()); }
@Test public void outputChannel() { QueueChannel channel = new QueueChannel(1); ServiceActivatingHandler endpoint = createEndpoint(); endpoint.setOutputChannel(channel); Message<?> message = MessageBuilder.withPayload("foo").build(); endpoint.handleMessage(message); Message<?> reply = channel.receive(0); assertNotNull(reply); assertEquals("FOO", reply.getPayload()); }
@Test public void returnAddressHeader() { QueueChannel channel = new QueueChannel(1); ServiceActivatingHandler endpoint = this.createEndpoint(); Message<?> message = MessageBuilder.withPayload("foo").setReplyChannel(channel).build(); endpoint.handleMessage(message); Message<?> reply = channel.receive(0); assertNotNull(reply); assertEquals("FOO", reply.getPayload()); }
@Test public void noOutputChannelFallsBackToReturnAddress() { QueueChannel channel = new QueueChannel(1); ServiceActivatingHandler endpoint = this.createEndpoint(); Message<?> message = MessageBuilder.withPayload("foo").setReplyChannel(channel).build(); endpoint.handleMessage(message); Message<?> reply = channel.receive(0); assertNotNull(reply); assertEquals("FOO", reply.getPayload()); }
@Test public void nullOk() { NullOkTestBean testBean = new NullOkTestBean(); ServiceActivatingHandler serviceActivator = new ServiceActivatingHandler(testBean); QueueChannel outputChannel = new QueueChannel(); serviceActivator.setOutputChannel(outputChannel); serviceActivator.setBeanFactory(mock(BeanFactory.class)); serviceActivator.afterPropertiesSet(); serviceActivator.handleMessage(new GenericMessage<>(new KafkaNull())); Message<?> result = outputChannel.receive(0); assertEquals("gotNull", result.getPayload()); }
@Test public void correlationIdNotSetIfMessageIsReturnedUnaltered() { QueueChannel replyChannel = new QueueChannel(1); ServiceActivatingHandler endpoint = new ServiceActivatingHandler(new Object() { @SuppressWarnings("unused") public Message<?> handle(Message<?> message) { return message; } }, "handle"); endpoint.setBeanFactory(mock(BeanFactory.class)); endpoint.afterPropertiesSet(); Message<String> message = MessageBuilder.withPayload("test") .setReplyChannel(replyChannel).build(); endpoint.handleMessage(message); Message<?> reply = replyChannel.receive(500); assertNull(new IntegrationMessageHeaderAccessor(reply).getCorrelationId()); }
@Test public void correlationIdSetByHandlerTakesPrecedence() { QueueChannel replyChannel = new QueueChannel(1); ServiceActivatingHandler endpoint = new ServiceActivatingHandler(new Object() { @SuppressWarnings("unused") public Message<?> handle(Message<?> message) { return MessageBuilder.fromMessage(message) .setCorrelationId("ABC-123").build(); } }, "handle"); endpoint.setBeanFactory(mock(BeanFactory.class)); endpoint.afterPropertiesSet(); Message<String> message = MessageBuilder.withPayload("test") .setReplyChannel(replyChannel).build(); endpoint.handleMessage(message); Message<?> reply = replyChannel.receive(500); Object correlationId = new IntegrationMessageHeaderAccessor(reply).getCorrelationId(); assertNotEquals(message.getHeaders().getId(), correlationId); assertEquals("ABC-123", correlationId); }
@Test(expected = ReplyRequiredException.class) public void noReplyMessageWithRequiresReply() { QueueChannel channel = new QueueChannel(1); ServiceActivatingHandler endpoint = new ServiceActivatingHandler(new TestNullReplyBean(), "handle"); endpoint.setRequiresReply(true); endpoint.setOutputChannel(channel); endpoint.setBeanFactory(mock(BeanFactory.class)); endpoint.afterPropertiesSet(); Message<?> message = MessageBuilder.withPayload("foo").build(); endpoint.handleMessage(message); }
@Test public void noReplyMessage() { QueueChannel channel = new QueueChannel(1); ServiceActivatingHandler endpoint = new ServiceActivatingHandler(new TestNullReplyBean(), "handle"); endpoint.setOutputChannel(channel); endpoint.setBeanFactory(mock(BeanFactory.class)); endpoint.afterPropertiesSet(); Message<?> message = MessageBuilder.withPayload("foo").build(); endpoint.handleMessage(message); assertNull(channel.receive(0)); }
@Test public void outputChannelTakesPrecedence() { QueueChannel channel1 = new QueueChannel(1); QueueChannel channel2 = new QueueChannel(1); ServiceActivatingHandler endpoint = createEndpoint(); endpoint.setOutputChannel(channel1); Message<?> message = MessageBuilder.withPayload("foo").setReplyChannel(channel2).build(); endpoint.handleMessage(message); Message<?> reply1 = channel1.receive(0); assertNotNull(reply1); assertEquals("FOO", reply1.getPayload()); Message<?> reply2 = channel2.receive(0); assertNull(reply2); }
@Test public void testCollectionIsConverted() { DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); DefaultConversionService conversionService = new DefaultConversionService(); conversionService.addConverter(new Converter<Foo, Bar>() { // Must be explicit type with generics @Override public Bar convert(Foo source) { return new Bar(); } }); BeanFactoryTypeConverter typeConverter = new BeanFactoryTypeConverter(conversionService); beanFactory.setConversionService(conversionService); typeConverter.setBeanFactory(beanFactory); Service service = new Service(); MethodInvokingMessageProcessor<Service> processor = new MethodInvokingMessageProcessor<>(service, "handle"); processor.setConversionService(conversionService); processor.setUseSpelInvoker(true); processor.setBeanFactory(beanFactory); ServiceActivatingHandler handler = new ServiceActivatingHandler(processor); QueueChannel replyChannel = new QueueChannel(); handler.setOutputChannel(replyChannel); handler.handleMessage(new GenericMessage<Collection<Foo>>(Collections.singletonList(new Foo()))); Message<?> message = replyChannel.receive(10000); assertNotNull(message); assertEquals("baz", message.getPayload()); }
@Test public void returnAddressHeaderWithChannelName() { TestUtils.TestApplicationContext testApplicationContext = TestUtils.createTestApplicationContext(); testApplicationContext.refresh(); QueueChannel channel = new QueueChannel(1); channel.setBeanName("testChannel"); TestChannelResolver channelResolver = new TestChannelResolver(); channelResolver.addChannel("testChannel", channel); ServiceActivatingHandler endpoint = this.createEndpoint(); endpoint.setChannelResolver(channelResolver); endpoint.setBeanFactory(testApplicationContext); endpoint.afterPropertiesSet(); Message<?> message = MessageBuilder.withPayload("foo") .setReplyChannelName("testChannel").build(); endpoint.handleMessage(message); Message<?> reply = channel.receive(0); assertNotNull(reply); assertEquals("FOO", reply.getPayload()); testApplicationContext.close(); }