INT-4162: TCP/UDP DSL
JIRA: https://jira.spring.io/browse/INT-4162 INT-4162: IP DSL - Phase I Connection Factories Phase 2 - Adapters/Gateways Phase 3 - UDP Polishing - PR Comments Remove unnecessary generics. More Polishing - PR Comments Checkstyle/Javadoc Fixes ComponentsRegistration Improvements Add ...Spec CTORs to avoid the issue described here: https://github.com/spring-projects/spring-integration-java-dsl/issues/137 Also other PR comments. Fix UDP Spec Inheritance Jdbc Lock Test Log Adjuster Fix Mongo Test Race Conditions * Fox typos in the `AbstractUdpOutboundChannelAdapterSpec` * Improve `IpIntegrationTests.testUdpInheritance()` * Change `fixed-rate` to `fixed-delay` in the `MongoDbInboundChannelAdapterIntegrationTests-context` to pursue single-threaded environment from poller for test
This commit is contained in:
committed by
Artem Bilan
parent
46348291ff
commit
65ec234697
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright 2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.integration.ip.dsl;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.context.ApplicationEventPublisher;
|
||||
import org.springframework.integration.ip.tcp.connection.AbstractClientConnectionFactory;
|
||||
import org.springframework.integration.ip.tcp.connection.AbstractServerConnectionFactory;
|
||||
import org.springframework.integration.ip.util.TestingUtilities;
|
||||
import org.springframework.integration.transformer.ObjectToStringTransformer;
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.messaging.support.GenericMessage;
|
||||
|
||||
/**
|
||||
* @author Gary Russell
|
||||
* @since 5.0
|
||||
*
|
||||
*/
|
||||
public class ConnectionFacforyTests {
|
||||
|
||||
@Test
|
||||
public void test() throws Exception {
|
||||
ApplicationEventPublisher publisher = e -> { };
|
||||
AbstractServerConnectionFactory server = Tcp.netServer(0).backlog(2).soTimeout(5000).get();
|
||||
final AtomicReference<Message<?>> received = new AtomicReference<>();
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
server.registerListener(m -> {
|
||||
received.set(new ObjectToStringTransformer().transform(m));
|
||||
latch.countDown();
|
||||
return false;
|
||||
});
|
||||
server.setApplicationEventPublisher(publisher);
|
||||
server.afterPropertiesSet();
|
||||
server.start();
|
||||
TestingUtilities.waitListening(server, null);
|
||||
AbstractClientConnectionFactory client = Tcp.netClient("localhost", server.getPort()).get();
|
||||
client.setApplicationEventPublisher(publisher);
|
||||
client.afterPropertiesSet();
|
||||
client.start();
|
||||
client.getConnection().send(new GenericMessage<>("foo"));
|
||||
assertTrue(latch.await(10, TimeUnit.SECONDS));
|
||||
assertEquals("foo", received.get().getPayload());
|
||||
client.stop();
|
||||
server.stop();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
/*
|
||||
* Copyright 2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.integration.ip.dsl;
|
||||
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.Matchers.instanceOf;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.context.ApplicationEventPublisher;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.integration.channel.QueueChannel;
|
||||
import org.springframework.integration.config.EnableIntegration;
|
||||
import org.springframework.integration.dsl.IntegrationFlow;
|
||||
import org.springframework.integration.dsl.IntegrationFlows;
|
||||
import org.springframework.integration.dsl.Transformers;
|
||||
import org.springframework.integration.dsl.context.IntegrationFlowContext;
|
||||
import org.springframework.integration.dsl.context.IntegrationFlowRegistration;
|
||||
import org.springframework.integration.ip.tcp.TcpReceivingChannelAdapter;
|
||||
import org.springframework.integration.ip.tcp.TcpSendingMessageHandler;
|
||||
import org.springframework.integration.ip.tcp.connection.AbstractClientConnectionFactory;
|
||||
import org.springframework.integration.ip.tcp.connection.AbstractServerConnectionFactory;
|
||||
import org.springframework.integration.ip.tcp.serializer.TcpCodecs;
|
||||
import org.springframework.integration.ip.udp.MulticastSendingMessageHandler;
|
||||
import org.springframework.integration.ip.udp.UnicastReceivingChannelAdapter;
|
||||
import org.springframework.integration.ip.util.TestingUtilities;
|
||||
import org.springframework.integration.support.MessageBuilder;
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.messaging.MessageChannel;
|
||||
import org.springframework.messaging.support.GenericMessage;
|
||||
import org.springframework.test.annotation.DirtiesContext;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
/**
|
||||
* @author Gary Russell
|
||||
* @since 5.0
|
||||
*
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@DirtiesContext
|
||||
public class IpIntegrationTests {
|
||||
|
||||
@Autowired
|
||||
private AbstractServerConnectionFactory server1;
|
||||
|
||||
@Autowired
|
||||
private IntegrationFlowContext flowContext;
|
||||
|
||||
@Autowired
|
||||
@Qualifier("outUdpAdapter.input")
|
||||
private MessageChannel udpOut;
|
||||
|
||||
@Autowired
|
||||
private UnicastReceivingChannelAdapter udpInbound;
|
||||
|
||||
@Autowired
|
||||
private QueueChannel udpIn;
|
||||
|
||||
@Test
|
||||
public void testTcpAdapters() throws Exception {
|
||||
ApplicationEventPublisher publisher = e -> { };
|
||||
AbstractServerConnectionFactory server = Tcp.netServer(0).backlog(2).soTimeout(5000).id("server").get();
|
||||
assertEquals("server", server.getComponentName());
|
||||
server.setApplicationEventPublisher(publisher);
|
||||
server.afterPropertiesSet();
|
||||
TcpReceivingChannelAdapter inbound = Tcp.inboundAdapter(server).get();
|
||||
QueueChannel received = new QueueChannel();
|
||||
inbound.setOutputChannel(received);
|
||||
inbound.afterPropertiesSet();
|
||||
inbound.start();
|
||||
TestingUtilities.waitListening(server, null);
|
||||
AbstractClientConnectionFactory client = Tcp.netClient("localhost", server.getPort()).id("client").get();
|
||||
assertEquals("client", client.getComponentName());
|
||||
client.setApplicationEventPublisher(publisher);
|
||||
client.afterPropertiesSet();
|
||||
TcpSendingMessageHandler handler = Tcp.outboundAdapter(client).get();
|
||||
handler.start();
|
||||
handler.handleMessage(new GenericMessage<>("foo"));
|
||||
Message<?> receivedMessage = received.receive(10000);
|
||||
assertNotNull(receivedMessage);
|
||||
assertEquals("foo", Transformers.objectToString().transform(receivedMessage).getPayload());
|
||||
client.stop();
|
||||
server.stop();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTcpGateways() {
|
||||
TestingUtilities.waitListening(this.server1, null);
|
||||
IntegrationFlow flow = f -> f
|
||||
.handle(Tcp.outboundGateway(Tcp.netClient("localhost", this.server1.getPort())
|
||||
.serializer(TcpCodecs.crlf())
|
||||
.deserializer(TcpCodecs.lengthHeader1())
|
||||
.id("client1"))
|
||||
.remoteTimeout(m -> 5000))
|
||||
.transform(Transformers.objectToString());
|
||||
IntegrationFlowRegistration theFlow = this.flowContext.registration(flow).register();
|
||||
assertThat(theFlow.getMessagingTemplate().convertSendAndReceive("foo", String.class), equalTo("FOO"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUdp() {
|
||||
TestingUtilities.waitListening(this.udpInbound, null);
|
||||
Message<String> outMessage = MessageBuilder.withPayload("foo")
|
||||
.setHeader("udp_dest", "udp://localhost:" + this.udpInbound.getPort())
|
||||
.build();
|
||||
this.udpOut.send(outMessage);
|
||||
Message<?> received = this.udpIn.receive(10000);
|
||||
assertNotNull(received);
|
||||
assertEquals("foo", Transformers.objectToString().transform(received).getPayload());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUdpInheritance() {
|
||||
UdpMulticastOutboundChannelAdapterSpec udpMulticastOutboundChannelAdapterSpec =
|
||||
Udp.outboundMulticastAdapter("headers['udp_dest']");
|
||||
|
||||
UdpMulticastOutboundChannelAdapterSpec udpMulticastOutboundChannelAdapterSpec1 =
|
||||
udpMulticastOutboundChannelAdapterSpec.lengthCheck(true);
|
||||
|
||||
UdpMulticastOutboundChannelAdapterSpec udpMulticastOutboundChannelAdapterSpec2 =
|
||||
udpMulticastOutboundChannelAdapterSpec1.timeToLive(10);
|
||||
|
||||
assertThat(udpMulticastOutboundChannelAdapterSpec2.get(), instanceOf(MulticastSendingMessageHandler.class));
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@EnableIntegration
|
||||
public static class Config {
|
||||
|
||||
@Bean
|
||||
public AbstractServerConnectionFactory server1() {
|
||||
return Tcp.netServer(0)
|
||||
.serializer(TcpCodecs.lengthHeader1())
|
||||
.deserializer(TcpCodecs.crlf())
|
||||
.get();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public IntegrationFlow inTcpGateway() {
|
||||
return IntegrationFlows.from(Tcp.inboundGateway(server1()))
|
||||
.transform(Transformers.objectToString())
|
||||
.<String, String>transform(String::toUpperCase)
|
||||
.get();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public IntegrationFlow inUdpAdapter() {
|
||||
return IntegrationFlows.from(Udp.inboundAdapter(0))
|
||||
.channel(udpIn())
|
||||
.get();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public QueueChannel udpIn() {
|
||||
return new QueueChannel();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public IntegrationFlow outUdpAdapter() {
|
||||
return f -> f.handle(Udp.outboundAdapter(m -> m.getHeaders().get("udp_dest")));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -16,11 +16,11 @@
|
||||
|
||||
package org.springframework.integration.ip.tcp;
|
||||
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.beans.DirectFieldAccessor;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.integration.ip.tcp.connection.AbstractServerConnectionFactory;
|
||||
@@ -45,7 +45,6 @@ public class AutoStartTests {
|
||||
|
||||
@Test
|
||||
public void testNetIn() throws Exception {
|
||||
assertFalse(cfS1.isAutoStartup());
|
||||
DirectFieldAccessor dfa = new DirectFieldAccessor(cfS1);
|
||||
assertNull(dfa.getPropertyValue("serverSocket"));
|
||||
startAndStop();
|
||||
|
||||
Reference in New Issue
Block a user