Polish RoutingBrokerTests
This commit is contained in:
@@ -51,7 +51,7 @@ import org.springframework.util.StringUtils;
|
|||||||
@Configuration(proxyBeanMethods = false)
|
@Configuration(proxyBeanMethods = false)
|
||||||
@EnableConfigurationProperties({ FunctionProperties.class, RSocketFunctionProperties.class })
|
@EnableConfigurationProperties({ FunctionProperties.class, RSocketFunctionProperties.class })
|
||||||
@ConditionalOnProperty(name = FunctionProperties.PREFIX + ".rsocket.enabled", matchIfMissing = true)
|
@ConditionalOnProperty(name = FunctionProperties.PREFIX + ".rsocket.enabled", matchIfMissing = true)
|
||||||
public class RSocketAutoConfiguration {
|
class RSocketAutoConfiguration {
|
||||||
|
|
||||||
private static Log logger = LogFactory.getLog(RSocketAutoConfiguration.class);
|
private static Log logger = LogFactory.getLog(RSocketAutoConfiguration.class);
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ import org.springframework.messaging.support.MessageBuilder;
|
|||||||
* @author Oleg Zhurakousky
|
* @author Oleg Zhurakousky
|
||||||
* @since 3.1
|
* @since 3.1
|
||||||
*/
|
*/
|
||||||
public class RSocketListenerFunction implements Function<Message<byte[]>, Publisher<Message<byte[]>>> {
|
class RSocketListenerFunction implements Function<Message<byte[]>, Publisher<Message<byte[]>>> {
|
||||||
|
|
||||||
private static String splash = " ____ _ _______ __ ____ __ _ ___ ____ __ __ \n" +
|
private static String splash = " ____ _ _______ __ ____ __ _ ___ ____ __ __ \n" +
|
||||||
" / __/__ ____(_)__ ___ _ / ___/ /__ __ _____/ / / __/_ _____ ____/ /_(_)__ ___ / _ \\/ __/__ ____/ /_____ / /_\n" +
|
" / __/__ ____(_)__ ___ _ / ___/ /__ __ _____/ / / __/_ _____ ____/ /_(_)__ ___ / _ \\/ __/__ ____/ /_____ / /_\n" +
|
||||||
@@ -86,8 +86,8 @@ public class RSocketListenerFunction implements Function<Message<byte[]>, Publis
|
|||||||
}
|
}
|
||||||
if (this.listenAddress != null) {
|
if (this.listenAddress != null) {
|
||||||
this.rsocketConnection = RSocketConnectionUtils.createServerSocket(rsocket, this.listenAddress);
|
this.rsocketConnection = RSocketConnectionUtils.createServerSocket(rsocket, this.listenAddress);
|
||||||
this.printSplashScreen(this.targetFunction.getFunctionDefinition(), functionType);
|
|
||||||
}
|
}
|
||||||
|
this.printSplashScreen(this.targetFunction.getFunctionDefinition(), functionType);
|
||||||
}
|
}
|
||||||
|
|
||||||
void stop() {
|
void stop() {
|
||||||
@@ -191,7 +191,6 @@ public class RSocketListenerFunction implements Function<Message<byte[]>, Publis
|
|||||||
private void printSplashScreen(String definition, Type type) {
|
private void printSplashScreen(String definition, Type type) {
|
||||||
System.out.println(splash);
|
System.out.println(splash);
|
||||||
System.out.println("Function Definition: " + definition + "; T[" + type + "]");
|
System.out.println("Function Definition: " + definition + "; T[" + type + "]");
|
||||||
System.out.println("RSocket Listen Address: " + this.listenAddress);
|
|
||||||
System.out.println("======================================================\n");
|
System.out.println("======================================================\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ import org.springframework.messaging.rsocket.RSocketConnectorConfigurer;
|
|||||||
@ConditionalOnProperty(name = FunctionProperties.PREFIX + ".rsocket.enabled", matchIfMissing = true)
|
@ConditionalOnProperty(name = FunctionProperties.PREFIX + ".rsocket.enabled", matchIfMissing = true)
|
||||||
@AutoConfigureBefore(RoutingClientAutoConfiguration.class)
|
@AutoConfigureBefore(RoutingClientAutoConfiguration.class)
|
||||||
@AutoConfigureAfter(RSocketAutoConfiguration.class)
|
@AutoConfigureAfter(RSocketAutoConfiguration.class)
|
||||||
public class RSocketRoutingAutoConfiguration {
|
class RSocketRoutingAutoConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public RSocketConnectorConfigurer functionRSocketConnectorConfigurer(
|
public RSocketConnectorConfigurer functionRSocketConnectorConfigurer(
|
||||||
|
|||||||
@@ -16,12 +16,11 @@
|
|||||||
|
|
||||||
package org.springframework.cloud.function.rsocket;
|
package org.springframework.cloud.function.rsocket;
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import io.rsocket.routing.client.spring.RoutingMetadata;
|
import io.rsocket.routing.client.spring.RoutingMetadata;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import reactor.core.publisher.Flux;
|
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
import reactor.test.StepVerifier;
|
import reactor.test.StepVerifier;
|
||||||
|
|
||||||
@@ -36,80 +35,91 @@ import org.springframework.util.SocketUtils;
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* @author Spencer Gibb
|
||||||
* @author Oleg Zhurakousky
|
* @author Oleg Zhurakousky
|
||||||
* @since 3.1
|
* @since 3.1
|
||||||
*/
|
*/
|
||||||
public class RoutingBrokerTests {
|
public class RoutingBrokerTests {
|
||||||
|
|
||||||
|
ConfigurableApplicationContext functionContext;
|
||||||
|
ConfigurableApplicationContext brokerContext;
|
||||||
|
ConfigurableApplicationContext clientContext;
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
public void cleanup() {
|
||||||
|
if (functionContext != null) {
|
||||||
|
functionContext.close();
|
||||||
|
}
|
||||||
|
if (brokerContext != null) {
|
||||||
|
brokerContext.close();
|
||||||
|
}
|
||||||
|
if (clientContext != null) {
|
||||||
|
clientContext.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testImperativeFunctionAsRequestReply() throws Exception {
|
public void testRoutingWithProperty() throws Exception {
|
||||||
|
this.setup(true);
|
||||||
|
RSocketRequester requester = clientContext.getBean(RSocketRequester.class);
|
||||||
|
Mono<String> result = requester.route("toupper") // used to find a messagemapping, so unused here
|
||||||
|
// auto creates metadata
|
||||||
|
.data("\"hello\"")
|
||||||
|
.retrieveMono(String.class);
|
||||||
|
|
||||||
ConfigurableApplicationContext functionContext = null;
|
StepVerifier
|
||||||
ConfigurableApplicationContext brokerContext = null;
|
.create(result)
|
||||||
ConfigurableApplicationContext clientContext = null;
|
.expectNext("\"HELLO\"")
|
||||||
try {
|
.expectComplete()
|
||||||
int routingBrokerProxyPort = SocketUtils.findAvailableTcpPort();
|
.verify();
|
||||||
int routingBrokerClusterPort = SocketUtils.findAvailableTcpPort();
|
}
|
||||||
|
|
||||||
// start broker
|
@Test
|
||||||
brokerContext = new SpringApplicationBuilder(SimpleConfiguration.class).web(WebApplicationType.NONE).run(
|
public void testRoutingWithMessage() throws Exception {
|
||||||
"--logging.level.io.rsocket.routing.broker=TRACE",
|
this.setup(false);
|
||||||
"--spring.cloud.function.rsocket.enabled=false",
|
RSocketRequester requester = clientContext.getBean(RSocketRequester.class);
|
||||||
"--io.rsocket.routing.client.enabled=false",
|
RoutingMetadata metadata = clientContext.getBean(RoutingMetadata.class);
|
||||||
"--io.rsocket.routing.broker.enabled=true",
|
Mono<String> result = requester.route("toupper") // used to find a messagemapping, so unused here
|
||||||
|
.metadata(metadata.address("samplefn"))
|
||||||
|
.data("\"hello\"")
|
||||||
|
.retrieveMono(String.class);
|
||||||
|
|
||||||
|
StepVerifier
|
||||||
|
.create(result)
|
||||||
|
.expectNext("\"HELLO\"")
|
||||||
|
.expectComplete()
|
||||||
|
.verify();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setup(boolean routingWithProperty) {
|
||||||
|
int routingBrokerProxyPort = SocketUtils.findAvailableTcpPort();
|
||||||
|
int routingBrokerClusterPort = SocketUtils.findAvailableTcpPort();
|
||||||
|
// start broker
|
||||||
|
brokerContext = new SpringApplicationBuilder(SimpleConfiguration.class).web(WebApplicationType.NONE).run(
|
||||||
|
"--logging.level.io.rsocket.routing.broker=TRACE", "--spring.cloud.function.rsocket.enabled=false",
|
||||||
|
"--io.rsocket.routing.client.enabled=false", "--io.rsocket.routing.broker.enabled=true",
|
||||||
"--io.rsocket.routing.broker.tcp.port=" + routingBrokerProxyPort,
|
"--io.rsocket.routing.broker.tcp.port=" + routingBrokerProxyPort,
|
||||||
"--io.rsocket.routing.broker.cluster.port=" + routingBrokerClusterPort);
|
"--io.rsocket.routing.broker.cluster.port=" + routingBrokerClusterPort);
|
||||||
|
|
||||||
// start function connecting to broker, service-name=samplefn
|
// start function connecting to broker, service-name=samplefn
|
||||||
functionContext = new SpringApplicationBuilder(SampleFunctionConfiguration.class)
|
functionContext = new SpringApplicationBuilder(SampleFunctionConfiguration.class).web(WebApplicationType.NONE)
|
||||||
.web(WebApplicationType.NONE).run(
|
.run("--logging.level.org.springframework.cloud.function=DEBUG",
|
||||||
"--logging.level.org.springframework.cloud.function=DEBUG",
|
"--io.rsocket.routing.client.enabled=true", "--io.rsocket.routing.client.service-name=samplefn",
|
||||||
"--io.rsocket.routing.client.enabled=true",
|
"--io.rsocket.routing.client.brokers[0].host=localhost",
|
||||||
"--io.rsocket.routing.client.service-name=samplefn",
|
"--io.rsocket.routing.client.brokers[0].port=" + routingBrokerProxyPort,
|
||||||
"--io.rsocket.routing.client.brokers[0].host=localhost",
|
"--io.rsocket.routing.broker.enabled=false", "--spring.cloud.function.definition=uppercase");
|
||||||
"--io.rsocket.routing.client.brokers[0].port=" + routingBrokerProxyPort,
|
|
||||||
"--io.rsocket.routing.broker.enabled=false",
|
|
||||||
"--spring.cloud.function.definition=uppercase");
|
|
||||||
|
|
||||||
// start testclient connecting to broker, for RSocketRequester
|
// start testclient connecting to broker, for RSocketRequester
|
||||||
clientContext = new SpringApplicationBuilder(SimpleConfiguration.class)
|
clientContext = new SpringApplicationBuilder(SimpleConfiguration.class).web(WebApplicationType.NONE).run(
|
||||||
.web(WebApplicationType.NONE).run(
|
"--logging.level.io.rsocket.routing.client=TRACE", "--spring.cloud.function.rsocket.enabled=false",
|
||||||
"--logging.level.io.rsocket.routing.client=TRACE",
|
"--io.rsocket.routing.client.enabled=true", "--io.rsocket.routing.client.service-name=testclient",
|
||||||
"--spring.cloud.function.rsocket.enabled=false",
|
routingWithProperty ? "--io.rsocket.routing.client.address.toupper.service_name=samplefn" : "",
|
||||||
"--io.rsocket.routing.client.enabled=true",
|
"--io.rsocket.routing.client.brokers[0].host=localhost",
|
||||||
"--io.rsocket.routing.client.service-name=testclient",
|
"--io.rsocket.routing.client.brokers[0].port=" + routingBrokerProxyPort,
|
||||||
"--io.rsocket.routing.client.address.toupper.service_name=samplefn",
|
"--io.rsocket.routing.broker.enabled=false");
|
||||||
"--io.rsocket.routing.client.brokers[0].host=localhost",
|
|
||||||
"--io.rsocket.routing.client.brokers[0].port=" + routingBrokerProxyPort,
|
|
||||||
"--io.rsocket.routing.broker.enabled=false");
|
|
||||||
|
|
||||||
RSocketRequester requester = clientContext.getBean(RSocketRequester.class);
|
|
||||||
//RoutingMetadata metadata = clientContext.getBean(RoutingMetadata.class);
|
|
||||||
Mono<String> result = requester.route("toupper") // used to find a messagemapping, so unused here
|
|
||||||
// auto creates metadata
|
|
||||||
//.metadata(metadata.address("samplefn"))
|
|
||||||
.data("\"hello\"")
|
|
||||||
.retrieveMono(String.class);
|
|
||||||
|
|
||||||
StepVerifier
|
|
||||||
.create(result)
|
|
||||||
.expectNext("\"HELLO\"")
|
|
||||||
.expectComplete()
|
|
||||||
.verify();
|
|
||||||
} finally {
|
|
||||||
if (functionContext != null) {
|
|
||||||
functionContext.close();
|
|
||||||
}
|
|
||||||
if (brokerContext != null) {
|
|
||||||
brokerContext.close();
|
|
||||||
}
|
|
||||||
if (clientContext != null) {
|
|
||||||
clientContext.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@EnableAutoConfiguration
|
@EnableAutoConfiguration
|
||||||
@Configuration
|
@Configuration
|
||||||
public static class SimpleConfiguration {
|
public static class SimpleConfiguration {
|
||||||
@@ -125,50 +135,5 @@ public class RoutingBrokerTests {
|
|||||||
return v.toUpperCase();
|
return v.toUpperCase();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
|
||||||
public Function<String, String> concat() {
|
|
||||||
return v -> {
|
|
||||||
return v + v;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
public Function<String, String> echo() {
|
|
||||||
return v -> v;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
public Function<Flux<String>, Flux<String>> uppercaseReactive() {
|
|
||||||
return flux -> flux.map(v -> {
|
|
||||||
System.out.println("Uppercasing: " + v);
|
|
||||||
return v.toUpperCase();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
public Consumer<byte[]> log() {
|
|
||||||
return v -> {
|
|
||||||
System.out.println("==> In Consumer: " + new String(v));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EnableAutoConfiguration
|
|
||||||
@Configuration
|
|
||||||
public static class AdditionalFunctionConfiguration {
|
|
||||||
@Bean
|
|
||||||
public Function<String, String> reverse() {
|
|
||||||
return v -> {
|
|
||||||
return new StringBuilder(v).reverse().toString();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
public Function<String, String> wrap() {
|
|
||||||
return v -> {
|
|
||||||
return "(" + v + ")";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user