Rsocket服务器异常:没有针对目标”的处理程序(目标不会从客户端传递到服务器)

时间:2019-08-09 08:52:51

标签: java spring-boot netty project-reactor rsocket

我为RSocket消息编写了一个小演示

问题是我无法访问Rsocket端点, 我从服务器收到以下异常:

客户端: 配置:

@Bean
RSocket rSocket() {
    return RSocketFactory.connect()
            .mimeType(MimeTypeUtils.APPLICATION_JSON_VALUE, MimeTypeUtils.APPLICATION_JSON_VALUE)
            .frameDecoder(PayloadDecoder.ZERO_COPY)
            .transport(TcpClientTransport.create(new InetSocketAddress(7500)))
            .start()
            .block();
}

@Bean
RSocketRequester requester(RSocketStrategies strategies) {
    return RSocketRequester.wrap(rSocket(), MimeTypeUtils.APPLICATION_JSON, MimeTypeUtils.APPLICATION_JSON, strategies);
}

控制器:

private final RSocketRequester requester;

@GetMapping("/greet/{name}")
public Publisher<GreetingsResponse> greet(@PathVariable String name) {
    return requester
            .route("hello")
            .data(new GreetingsRequest(name))
            .retrieveMono(GreetingsResponse.class);
}

服务器端(使用spring Rsocket): yml:

spring:
  rsocket:
    server:
      port: 7500
      transport: tcp
  main:
    lazy-initialization: true

配置:

@MessageMapping("hello")
Mono<GreetingsResponse> greet(GreetingsRequest request) {
    return Mono.just(new GreetingsResponse("Hello " + request.getName() + " @ " + Instant.now()));
} 

我很确定这与新的wrap函数RSocketRequester.wrap有关 由于它接受新参数metadataMimeType,因此将其设置为application / Json, 但这似乎不起作用

stackTrace:

  

org.springframework.messaging.MessageDeliveryException:没有用于的处理程序   目的地“”   org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler.handleNoMatch(RSocketMessageHandler.java:312)     在   org.springframework.messaging.handler.invocation.reactive.AbstractMethodMessageHandler.getHandlerMethod(AbstractMethodMessageHandler.java:445)     在   org.springframework.messaging.handler.invocation.reactive.AbstractMethodMessageHandler.handleMessage(AbstractMethodMessageHandler.java:417)     在   org.springframework.messaging.rsocket.annotation.support.MessagingRSocket.lambda $ handleAndReply $ 4(MessagingRSocket.java:173)     在反应堆。核心。发布者.MonoDefer.subscribe(MonoDefer.java:44)在   react..core.publisher.Mono.subscribe(Mono.java:3920)位于   Reactor.core.publisher.FluxConcatArray $ ConcatArraySubscriber.onComplete(FluxConcatArray.java:207)     在   Reactor.core.publisher.FluxConcatArray.subscribe(FluxConcatArray.java:80)     在   Reactor.core.publisher.MonoFromFluxOperator.subscribe(MonoFromFluxOperator.java:74)     在   io.rsocket.RSocketResponder.handleRequestResponse(RSocketResponder.java:386)     在io.rsocket.RSocketResponder.handleFrame(RSocketResponder.java:298)     在   Reactor.core.publisher.LambdaSubscriber.onNext(LambdaSubscriber.java:160)     在   Reactor.core.publisher.MonoFlatMapMany $ FlatMapManyInner.onNext(MonoFlatMapMany.java:238)     在   Reactor.core.publisher.FluxGroupBy $ UnicastGroupedFlux.drainRegular(FluxGroupBy.java:554)     在   Reactor.core.publisher.FluxGroupBy $ UnicastGroupedFlux.drain(FluxGroupBy.java:630)     在   Reactor.core.publisher.FluxGroupBy $ UnicastGroupedFlux.subscribe(FluxGroupBy.java:696)     在react..core.publisher.Flux.subscribe(Flux.java:8000)在   Reactor.core.publisher.MonoFlatMapMany $ FlatMapManyMain.onNext(MonoFlatMapMany.java:184)     在   Reactor.core.publisher.Operators $ MonoSubscriber.complete(Operators.java:1582)     在   Reactor.core.publisher.MonoProcessor.onNext(MonoProcessor.java:316)     在   io.rsocket.internal.ClientServerInputMultiplexer.lambda $ new $ 1(ClientServerInputMultiplexer.java:116)     在   Reactor.core.publisher.LambdaSubscriber.onNext(LambdaSubscriber.java:160)     在   Reactor.core.publisher.FluxGroupBy $ GroupByMain.drainLoop(FluxGroupBy.java:380)     在   Reactor.core.publisher.FluxGroupBy $ GroupByMain.drain(FluxGroupBy.java:316)     在   Reactor.core.publisher.FluxGroupBy $ GroupByMain.onNext(FluxGroupBy.java:201)     在   Reactor.core.publisher.FluxMap $ MapSubscriber.onNext(FluxMap.java:114)     在   Reactor.core.publisher.FluxMap $ MapSubscriber.onNext(FluxMap.java:114)     在   react.netty.channel.FluxReceive.drainReceiver(FluxReceive.java:206)     在   react.netty.channel.FluxReceive.onInboundNext(FluxReceive.java:322)     在   react.netty.channel.ChannelOperations.onInboundNext(ChannelOperations.java:342)     在   Reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:91)     在   io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)     在   io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)     在   io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)     在   io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:328)     在   io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:302)     在   io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)     在   io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)     在   io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)     在   io.netty.channel.DefaultChannelPipeline $ HeadContext.channelRead(DefaultChannelPipeline.java:1421)     在   io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)     在   io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)     在   io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930)     在   io.netty.channel.nio.AbstractNioByteChannel $ NioByteUnsafe.read(AbstractNioByteChannel.java:163)     在   io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:697)     在   io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:632)     在   io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:549)     在io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:511)处   io.netty.util.concurrent.SingleThreadEventExecutor $ 5.run(SingleThreadEventExecutor.java:918)     在   io.netty.util.internal.ThreadExecutorMap $ 2.run(ThreadExecutorMap.java:74)     在   io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)     在java.base / java.lang.Thread.run(Thread.java:834)

2 个答案:

答案 0 :(得分:5)

您使用的是哪个春季版本? 我有一个相同的问题,我通过更改spring-boot-starter-parent 2.2.0.M3来解决了。

这是我的出处 all-from-out


已添加。

我解决了这个问题。您需要将mimeType更改为message/x.rsocket.routing.v0。 您可以从MetadataExtractor.ROUTING获取此mimeType。

@Bean
RSocket rSocket() {
    return RSocketFactory.connect()
            .mimeType(MetadataExtractor.ROUTING.toString(), MimeTypeUtils.APPLICATION_JSON_VALUE)
            .frameDecoder(PayloadDecoder.ZERO_COPY)
            .transport(TcpClientTransport.create(new InetSocketAddress(7500)))
            .start()
            .block();
}

@Bean
RSocketRequester requester(RSocketStrategies strategies) {
    return RSocketRequester.wrap(rSocket(), MimeTypeUtils.APPLICATION_JSON, MetadataExtractor.ROUTING, strategies);
}

答案 1 :(得分:1)

对于RSocketRequester,方法名称从 create wrap ,然后添加第三个参数。所以,我认为现在还不稳定。

我的选择是使用构建器方法,如下所示。

@Bean
RSocketRequester rSocketRequester(RSocketStrategies strategies) {
    InetSocketAddress address = new InetSocketAddress(clientConfigProp.getHost(), clientConfigProp.getPort());
    log.info("RSocket server address={}", address);
    return RSocketRequester.builder()
        .rsocketFactory(factory -> factory
            .dataMimeType(MimeTypeUtils.ALL_VALUE)
            .frameDecoder(PayloadDecoder.ZERO_COPY))
        .rsocketStrategies(strategies)
        .connect(TcpClientTransport.create(address))
        .retry().block();
}