Исключение сервера 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:

Какую весеннюю версию вы используете? У меня была такая же проблема, и я решил ее, изменив spring-boot-starter-parent 2.2.0.M3.


person Roie Beck    schedule 09.08.2019    source источник


Ответы (2)


Вот мой источник https://github.com/han1448/spring-rsocket-example

Добавлен.


Я решил эту проблему. Вам нужно изменить mimeType на message/x.rsocket.routing.v0. Вы можете получить этот mimeType из MetadataExtractor.ROUTING.

Для message/x.rsocket.routing.v0 имя метода от create до wrap, а затем добавьте третий параметр. Так что, думаю, сейчас он нестабилен.

@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);
}
person Seung Hyun Han    schedule 10.08.2019
comment
Однако вместо этого мне удалось использовать RSocketRequester.Builder: docs.spring.io/spring-boot/docs/2.2.0.M6/reference/html/ - person Trisha; 20.09.2019
comment
org.springframework.messaging.MessageDeliveryException: Нет обработчика для пункта назначения '' в org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler.handleNoMatch (RSocketMessageHandler.java:312) в org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler.java:312 AbstractMethodMessageHandler.getHandlerMethod (AbstractMethodMessageHandler.java:445) по адресу org.springframework.messaging.handler.invocation.reactive.AbstractMethodMessageHandler.handleMessage (AbstractMethodMcketMessageHandler.handleMessage (AbstractMethodMcketMessage.soppler). handleAndReply $ 4 (MessagingRSocket.java:173) на response.core.publisher.MonoDefer.subscribe (MonoDefer.java:44) на response.core.publisher.Mono.subscribe (Mono.java:3920) на response.core.publisher. FluxConcatArray $ ConcatArraySubscriber.onComplete (FluxConcatArray.java:207) по адресуactor.core.publisher.FluxConcatArray.subscribe (FluxConcatArray.java:80) по адресу response.core.p ublisher.MonoFromFluxOperator.subscribe (MonoFromFluxOperator.java:74) по адресу io.rsocket.RSocketResponder.handleRequestResponse (RSocketResponder.java:386) по адресу io.rsocket.RSocketResponder.java.jsponder.jsponder.jsponder.jsublisher.jsponder.jsponder.jublisher .onNext (LambdaSubscriber.java:160) по адресуactor.core.publisher.MonoFlatMapMany $ FlatMapManyInner.onNext (MonoFlatMapMany.java:238) по адресуactor.core.publisher.FluxGroupByular (UnicastGroupedFlux.drain). core.publisher.FluxGroupBy $ UnicastGroupedFlux.drain (FluxGroupBy.java:630) в response.core.publisher.FluxGroupBy $ UnicastGroupedFlux.subscribe (FluxGroupBy.java:696) atactor.core.publisher.Flux. 8000) по адресу response.core.publisher.MonoFlatMapMany $ FlatMapManyMain.onNext (MonoFlatMapMany.java:184) по адресу response.core.publisher.Operators $ MonoSubscriber.complete (Operators.java:1582), что и response.core.publisher.MonoProcess. (MonoProc essor.java:316) в io.rsocket.internal.ClientServerInputMultiplexer.lambda $ new $ 1 (ClientServerInputMultiplexer.java:116) в response.core.publisher.LambdaSubscriber.onNext (LambdaSubscriber.java:160.publisher.java:160.publisher. FluxGroupBy $ GroupByMain.drainLoop (FluxGroupBy.java:380) по адресуactor.core.publisher.FluxGroupBy $ GroupByMain.drain (FluxGroupBy.java:316) по адресуactor.core.publisher.FluxGroupBy $ GroupByMain.java: Ne20 на response.core.publisher. FluxMap $ MapSubscriber.onNext (FluxMap.java:114) по адресу response.core.publisher.FluxMap $ MapSubscriber.onNext (FluxMap.java:114) по адресуactor.netty.channel.FluxReceive.drainReceiver (FluxReceive.java:206) .netty.channel.FluxReceive.onInboundNext (FluxReceive.java:322) по адресуactor.netty.channel.ChannelOperations.onInboundNext (ChannelOperations.java:342) по адресуactor.netty.channel.ChannelOperationsHandler.channelRead (ChannelOperationsHandler.channelRead) (ChannelOperationsHandler.channelRead) (ChannelOperationsHandler.channelRead) io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:374) в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.invokeChannelRead) в io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead (ByteToMessageDecoder.java:328) в io.netty.handler.codec.ByteToMessageDecoder.channelRead (ByteToMessageDecod er.java:302) в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:374) в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelContext.invokeChannelRead (AbstractChannelChannelContext. (AbstractChannelHandlerContext.java:352) по адресу io.netty.channel.DefaultChannelPipeline $ HeadContext.channelRead (DefaultChannelPipeline.java:1421) по адресу io.netty.channel.AbstractChannelHandlerContext.net.invokeChannel.java: AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:360) в io.netty.channel.DefaultChannelPipeline.fireChannelRead (DefaultChannelPipeline.java:930) в io.netty.channel.java: .netty.channel.nio.NioEventLoop.processSelectedKey (NioEventLoop.java:697) на io.netty.channe l.nio.NioEventLoop.processSelectedKeysOptimized (NioEventLoop.java:632) по адресу io.netty.channel.nio.NioEventLoop.processSelectedKeys (NioEventLoop.java:549) по адресу io.netty.channel.nio.NioEvent 511) в io.netty.util.concurrent.SingleThreadEventExecutor $ 5.run (SingleThreadEventExecutor.java:918) в io.netty.util.internal.ThreadExecutorMap $ 2.run (ThreadExecutorMap.java:74) в io.netcty.contil.con .FastThreadLocalRunnable.run (FastThreadLocalRunnable.java:30) в java.base / java.lang. Thread.run (Thread.java:834) - person Trisha; 20.09.2019

Мой выбор - использовать метод построителя, как показано ниже.

Это полностью устранило мою проблему! К сожалению, он больше не компилируется под M6

@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();
}
person feuyeux    schedule 14.09.2019