Direct delegation to RSocketMessageHandler

Simplify handling by eliminating the use of a message channel. Instead
MessageHandlerAcceptor now extends from RSocketMessageHandler and
delegates directly to it.

See gh-21987
This commit is contained in:
Rossen Stoyanchev
2019-02-26 19:10:02 -05:00
parent 555dca9aff
commit fa95b010cb
13 changed files with 223 additions and 467 deletions

View File

@@ -38,7 +38,6 @@ import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.messaging.Message;
import org.springframework.messaging.ReactiveSubscribableChannel;
import org.springframework.messaging.handler.DestinationPatternsMessageCondition;
import org.springframework.messaging.handler.annotation.MessageExceptionHandler;
import org.springframework.messaging.handler.annotation.MessageMapping;
@@ -48,7 +47,6 @@ import org.springframework.stereotype.Controller;
import static java.nio.charset.StandardCharsets.*;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
/**
* Unit tests for {@link MessageMappingMessageHandler}.
@@ -134,9 +132,7 @@ public class MessageMappingMessageHandlerTests {
context.registerSingleton("testController", TestController.class);
context.refresh();
ReactiveSubscribableChannel channel = mock(ReactiveSubscribableChannel.class);
MessageMappingMessageHandler messageHandler = new MessageMappingMessageHandler(channel);
MessageMappingMessageHandler messageHandler = new MessageMappingMessageHandler();
messageHandler.getReturnValueHandlerConfigurer().addCustomHandler(this.returnValueHandler);
messageHandler.setApplicationContext(context);
messageHandler.setEmbeddedValueResolver(new EmbeddedValueResolver(context.getBeanFactory()));

View File

@@ -23,6 +23,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
import org.hamcrest.Matchers;
import org.junit.Test;
@@ -193,11 +194,6 @@ public class MethodMessageHandlerTests {
private PathMatcher pathMatcher = new AntPathMatcher();
public TestMethodMessageHandler() {
setHandlerPredicate(handlerType -> handlerType.getName().endsWith("Controller"));
}
@Override
protected List<? extends HandlerMethodArgumentResolver> initArgumentResolvers() {
return Collections.emptyList();
@@ -208,6 +204,11 @@ public class MethodMessageHandlerTests {
return Collections.singletonList(this.returnValueHandler);
}
@Override
protected Predicate<Class<?>> initHandlerPredicate() {
return handlerType -> handlerType.getName().endsWith("Controller");
}
@Nullable
public Object getLastReturnValue() {
return this.returnValueHandler.getLastReturnValue();

View File

@@ -35,11 +35,8 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.codec.CharSequenceEncoder;
import org.springframework.core.codec.StringDecoder;
import org.springframework.messaging.ReactiveMessageChannel;
import org.springframework.messaging.ReactiveSubscribableChannel;
import org.springframework.messaging.handler.annotation.MessageExceptionHandler;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.support.DefaultReactiveMessageChannel;
import org.springframework.stereotype.Controller;
import org.springframework.util.MimeTypeUtils;
@@ -69,12 +66,9 @@ public class RSocketClientToServerIntegrationTests {
context = new AnnotationConfigApplicationContext(ServerConfig.class);
ReactiveMessageChannel messageChannel = context.getBean(ReactiveMessageChannel.class);
RSocketStrategies rsocketStrategies = context.getBean(RSocketStrategies.class);
server = RSocketFactory.receive()
.addServerPlugin(interceptor)
.acceptor(new MessagingAcceptor(messageChannel))
.acceptor(context.getBean(MessageHandlerAcceptor.class))
.transport(TcpServerTransport.create("localhost", 7000))
.start()
.block();
@@ -86,7 +80,7 @@ public class RSocketClientToServerIntegrationTests {
.block();
requester = RSocketRequester.create(
client, MimeTypeUtils.TEXT_PLAIN, rsocketStrategies);
client, MimeTypeUtils.TEXT_PLAIN, context.getBean(RSocketStrategies.class));
}
@AfterClass
@@ -254,15 +248,10 @@ public class RSocketClientToServerIntegrationTests {
}
@Bean
public ReactiveSubscribableChannel rsocketChannel() {
return new DefaultReactiveMessageChannel();
}
@Bean
public RSocketMessageHandler rsocketMessageHandler() {
RSocketMessageHandler handler = new RSocketMessageHandler(rsocketChannel());
handler.setRSocketStrategies(rsocketStrategies());
return handler;
public MessageHandlerAcceptor messageHandlerAcceptor() {
MessageHandlerAcceptor acceptor = new MessageHandlerAcceptor();
acceptor.setRSocketStrategies(rsocketStrategies());
return acceptor;
}
@Bean

View File

@@ -17,7 +17,6 @@ package org.springframework.messaging.rsocket;
import java.time.Duration;
import java.util.Collections;
import java.util.List;
import io.rsocket.Closeable;
import io.rsocket.RSocket;
@@ -40,10 +39,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.codec.CharSequenceEncoder;
import org.springframework.core.codec.StringDecoder;
import org.springframework.messaging.ReactiveMessageChannel;
import org.springframework.messaging.ReactiveSubscribableChannel;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.support.DefaultReactiveMessageChannel;
import org.springframework.stereotype.Controller;
/**
@@ -57,23 +53,15 @@ public class RSocketServerToClientIntegrationTests {
private static Closeable server;
private static MessagingAcceptor clientAcceptor;
@BeforeClass
@SuppressWarnings("ConstantConditions")
public static void setupOnce() {
context = new AnnotationConfigApplicationContext(ServerConfig.class);
ReactiveMessageChannel messageChannel = context.getBean("serverChannel", ReactiveMessageChannel.class);
RSocketStrategies rsocketStrategies = context.getBean(RSocketStrategies.class);
clientAcceptor = new MessagingAcceptor(
context.getBean("clientChannel", ReactiveMessageChannel.class));
context = new AnnotationConfigApplicationContext(RSocketConfig.class);
server = RSocketFactory.receive()
.acceptor(new MessagingAcceptor(messageChannel, rsocketStrategies))
.acceptor(context.getBean("serverAcceptor", MessageHandlerAcceptor.class))
.transport(TcpServerTransport.create("localhost", 7000))
.start()
.block();
@@ -116,7 +104,7 @@ public class RSocketServerToClientIntegrationTests {
rsocket = RSocketFactory.connect()
.setupPayload(DefaultPayload.create("", destination))
.dataMimeType("text/plain")
.acceptor(clientAcceptor)
.acceptor(context.getBean("clientAcceptor", MessageHandlerAcceptor.class))
.transport(TcpClientTransport.create("localhost", 7000))
.start()
.block();
@@ -212,13 +200,13 @@ public class RSocketServerToClientIntegrationTests {
Mono.fromRunnable(testEcho)
.doOnError(ex -> result.onError(ex))
.doOnSuccess(o -> result.onComplete())
.subscribeOn(Schedulers.elastic())
.subscribeOn(Schedulers.elastic()) // StepVerifier will block
.subscribe();
}
}
private static class ClientController {
private static class ClientHandler {
final ReplayProcessor<String> fireForgetPayloads = ReplayProcessor.create();
@@ -251,11 +239,11 @@ public class RSocketServerToClientIntegrationTests {
@Configuration
static class ServerConfig {
static class RSocketConfig {
@Bean
public ClientController clientController() {
return new ClientController();
public ClientHandler clientHandler() {
return new ClientHandler();
}
@Bean
@@ -264,26 +252,17 @@ public class RSocketServerToClientIntegrationTests {
}
@Bean
public ReactiveSubscribableChannel clientChannel() {
return new DefaultReactiveMessageChannel();
public MessageHandlerAcceptor clientAcceptor() {
MessageHandlerAcceptor acceptor = new MessageHandlerAcceptor();
acceptor.setHandlers(Collections.singletonList(clientHandler()));
acceptor.setAutoDetectDisabled();
acceptor.setRSocketStrategies(rsocketStrategies());
return acceptor;
}
@Bean
public ReactiveSubscribableChannel serverChannel() {
return new DefaultReactiveMessageChannel();
}
@Bean
public RSocketMessageHandler clientMessageHandler() {
List<Object> handlers = Collections.singletonList(clientController());
RSocketMessageHandler handler = new RSocketMessageHandler(clientChannel(), handlers);
handler.setRSocketStrategies(rsocketStrategies());
return handler;
}
@Bean
public RSocketMessageHandler serverMessageHandler() {
RSocketMessageHandler handler = new RSocketMessageHandler(serverChannel());
public MessageHandlerAcceptor serverAcceptor() {
MessageHandlerAcceptor handler = new MessageHandlerAcceptor();
handler.setRSocketStrategies(rsocketStrategies());
return handler;
}