问题标签 [reactor-netty]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1609 浏览

spring-boot - 无法从 Flux / Mono 读取值

我有一个包含两部分的简单程序:一个 Spring 5 服务器,它有一个返回 Mono<Double> 的端点,以及一个读取值并打印它的客户端程序。

当我浏览到http://localhost:8080/rand时,会返回一个 double 值。但是,当我使用客户端时,检索到的值始终为空(响应状态为 200)。

我错过了什么?

文件 Main.java

文件 MyController.java

文件 MyClient.java

0 投票
1 回答
1841 浏览

spring-boot - WebClient 停止从 Flux 读取时的异常

我创建了一个返回无限 Flux 的服务器和一个从响应中异步读取对象的客户端。我希望客户端取消订阅 Flux 并停止处理它。

服务器的控制器:

客户端:

这是取消订阅流的正确方法吗?
当客户端“想要”停止读取更多数据时,它需要做什么?

当客户端取消订阅(使用disposable.dispose())时,服务器端会抛出2个异常(IOException和UnsupportedOperationException):

java.io.IOException:
sun.nio.ch.FileDispatcherImpl.writev0(本机方法)的管道损坏 ~[na:1.8.0_131]
在 sun.nio.ch.SocketDispatcher.writev(SocketDispatcher.java:51)~[na :1.8.0_131]
在 sun.nio.ch.IOUtil.write(IOUtil.java:148) ~[na:1.8.0_131]
在 sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:504) ~ [na :1.8.0_131]
在 io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:403) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io.netty .channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:934) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:362) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io.netty.channel.AbstractChannel$ AbstractUnsafe.flush(AbstractChannel.java:901) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1321) ~ [netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776) ~[netty-transport-4.1.16.Final.jar: 4.1.16.Final]
在 io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.flush( CombinedChannelDuplexHandler.java:533)~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
at io.netty.channel.ChannelOutboundHandlerAdapter.flush(ChannelOutboundHandlerAdapter.java:115)~[netty-transport-4.1 .16.Final.jar:4.1.16.Final]
在 io.netty.channel.CombinedChannelDuplexHandler.flush(CombinedChannelDuplexHandler.java:358) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext. java:749) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117) ~[netty-transport-4.1.16 .Final.jar:4.1.16.Final]
在 io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io .netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 reactor.ipc.netty.channel.ChannelOperationsHandler$PublisherSender。 onComplete(ChannelOperationsHandler.java:505) ~[reactor-netty-0.7.1.RELEASE.jar:0.7.1.RELEASE]
at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:130) ~[reactor -core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxConcatArray$ConcatArraySubscriber.onComplete(FluxConcatArray.java:184) ~[reactor-core-3.1.1.RELEASE.jar: 3.1.1.RELEASE]
在 reactor.core.publisher.FluxConcatArray.subscribe(FluxConcatArray.java:80) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxMap.subscribe(FluxMap.java:62) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.Flux.subscribe(Flux. java:6516) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.ipc.netty.channel.ChannelOperationsHandler.drain(ChannelOperationsHandler.java:433) ~[reactor-netty-0.7 .1.RELEASE.jar:0.7.1.RELEASE]
在 reactor.ipc.netty.channel.ChannelOperationsHandler.flush(ChannelOperationsHandler.java:179) ~[reactor-netty-0.7.1.RELEASE.jar:0.7.1。发布]
在 io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:802) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext. java:814) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:794) ~[netty-transport-4.1.16 .Final.jar:4.1.16.Final]
在 io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:831) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io .netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:1041) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:300) ~[netty-transport-4.1.16.Final.jar:4.1.16.Final]
在 reactor.ipc.netty.NettyOutbound.lambda$sendObject$6 (NettyOutbound.java:298)~[reactor-netty-0.7.1.RELEASE.jar:0.7.1.RELEASE]
at reactor.ipc.netty.FutureMono$DeferredFutureMono.subscribe(FutureMono.java:106)~[reactor- netty-0.7.1.RELEASE.jar:0.7.1.RELEASE]
在 reactor.core.publisher.Mono.subscribe(Mono.java:2913) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1 .RELEASE]
在 reactor.ipc.netty.NettyOutbound.subscribe(NettyOutbound.java:356) ~[reactor-netty-0.7.1.RELEASE.jar:0.7.1.RELEASE]
在 reactor.core.publisher.FluxConcatMap$ConcatMapDelayed .drain(FluxConcatMap.java:744) [reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxConcatMap$ConcatMapDelayed.onNext(FluxConcatMap.java:581) [reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxMap$MapSubscriber.onNext (FluxMap.java:108) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.http.server.reactive.ChannelSendOperator$WriteBarrier.onNext(ChannelSendOperator.java:150) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE]
在 reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:115) ~[reactor-core-3.1.1.RELEASE .jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxGenerate$GenerateSubscription.next(FluxGenerate.java:164) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 io.github.msayag.webflux.MyController.lambda$getStreamOfLongs$0(MyController.java:44) ~[classes/:na]
...
在 io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:第858章~[netty-common-4.1.16.Final.jar:4.1.16.Final]
在java.lang.Thread.run(Thread.java:748)~[na:1.8.0_131]

其次是

2017-11-24 01:04:09.476 错误 83663 --- [ctor-http-nio-2] oswsadapter.HttpWebHandlerAdapter:无法处理请求

java.lang.UnsupportedOperationException: null
at java.util.Collections$UnmodifiableMap.put(Collections.java:1457) ~[na:1.8.0_131]
at org.springframework.http.HttpHeaders.set(HttpHeaders.java:1439) ~ [spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE]
在 org.springframework.http.HttpHeaders.setContentType(HttpHeaders.java:849) ~[spring-web-5.0.1.RELEASE.jar: 5.0.1.RELEASE]
在 org.springframework.boot.autoconfigure.web.reactive.error.AbstractErrorWebExceptionHandler.write(AbstractErrorWebExceptionHandler.java:235) ~[spring-boot-autoconfigure-2.0.0.M6.jar:2.0.0 .M6]
在 org.springframework.boot.autoconfigure.web.reactive.error.AbstractErrorWebExceptionHandler.lambda$handle$1(AbstractErrorWebExceptionHandler.java:228) ~[spring-boot-autoconfigure-2.0.0.M6.jar:2.0.0.M6]
在 reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:118) [reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.Operators$MonoSubscriber.complete (Operators.java:1092) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:241) ~[reactor- core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:198) ~[reactor-core-3.1.1.RELEASE.jar:3.1 .1.发布]
在 reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:1649) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber。 request(FluxPeekFuseable.java:138) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onSubscribe(MonoFlatMap.java:230) ~[reactor -core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onSubscribe(FluxPeekFuseable.java:172) ~[reactor-core-3.1.1.RELEASE.jar: 3.1.1.RELEASE]
在 reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.MonoPeekFuseable.subscribe(MonoPeekFuseable.java:74) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext( MonoFlatMap.java:150) [reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67) ~[reactor-core- 3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1 .RELEASE]
在 reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:1649) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:1463) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.Operators$MultiSubscriptionSubscriber。 onSubscribe(Operators.java:1337) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54) ~[reactor-core -3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1. RELEASE]
在 reactor.core.publisher.Mono.subscribe(Mono.java:2913) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.Operators.complete( Operators.java:125) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.MonoEmpty.subscribe(MonoEmpty.java:45) ~[reactor-core-3.1 .1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap. java:60) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.Mono.subscribe(Mono.java:2913) ~[reactor-core-3.1.1 .RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:97) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.MonoFlatMap$FlatMapMain.secondError(MonoFlatMap.java:185) [reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.MonoFlatMap$FlatMapInner.onError (MonoFlatMap.java:251)~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:100) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.Operators.error( Operators.java:175) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:129) ~[reactor-core-3.1 .1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:53) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.Mono.subscribe(Mono.java:2913) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:97) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 org.springframework.http.server.reactive。 ChannelSendOperator$WriteCompletionBarrier.onError(ChannelSendOperator.java:339) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE]
at reactor.core.publisher.MonoNext$NextSubscriber.onError(MonoNext.java:87 ) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onError(Operators.java:1332) ~[reactor-core-3.1.1. RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.Operators$MonoSubscriber.onError(Operators.java:1135) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.MonoIgnoreThen$ThenAcceptInner.onError(MonoIgnoreThen.java:300) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber。 onError(MonoIgnoreElements.java:75)~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at reactor.core.publisher.FluxConcatMap$ConcatMapDelayed.drain(FluxConcatMap.java:660)~[reactor -core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 reactor.core.publisher.FluxConcatMap$ConcatMapDelayed.onNext(FluxConcatMap.java:581) ~[reactor-core-3.1.1.RELEASE.jar: 3.1.1.RELEASE]
在 reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:108) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在 org.springframework.http.server.reactive.ChannelSendOperator$WriteBarrier.onNext(ChannelSendOperator.java:150) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE]
在 reactor.core.publisher。 FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:115) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at reactor.core.publisher.FluxGenerate$GenerateSubscription.next(FluxGenerate.java:164 ) ~[reactor-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at io.github.msayag.webflux.MyController.lambda$getStreamOfLongs$0(MyController.java:44) ~[classes/:na]
...
在 io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) ~[netty-common-4.1.16.Final.jar:4.1.16.Final]
在 java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_131]

0 投票
3 回答
6608 浏览

spring - 使用 spring webclient 对 http 请求进行可读的调试日志记录

我正在使用 Spring 反应式 WebClient 向 http 服务器发送请求。为了查看正在发送的底层请求和响应,我为reactor.ipc.netty包启用了调试日志记录。

可以正常查看传出请求的标头。

虽然我通过 http 发送和接收纯文本,但日志包含以下格式的请求和响应(是十六进制吗?)

我不确定如何以易于理解的方式查看记录的数据。最好以可理解的方式记录请求和响应

这是记录数据的片段

发现由于同一个库而必须发生的未回答问题:Reading a HttpContent that has a PooledUnsafeDirectByteBuf

在这里提出了一个问题

似乎有一种正统的观点认为响应式客户端不需要调试。这是一个完全没有意义的论点,因为我们使用 , , 和其他工具rest clientpostman发送curl请求httpie和查看响应

0 投票
2 回答
10166 浏览

spring-boot - 如何使响应式 Web 客户端遵循 3XX 重定向?

我创建了一个基本的 REST 控制器,它使用 netty 在 Spring-boot 2 中使用响应式 Webclient 发出请求。

当我收到 3XX 响应代码时,我希望 Web 客户端使用响应中的 Location 跟踪重定向并递归调用该 URI,直到我收到非 3XX 响应。

我得到的实际结果是 3XX 响应。

0 投票
1 回答
2234 浏览

java - 为什么spring webflux默认选择jetty然后失败?

我正在尝试运行基于 Spring boot 2.0.0.M7 的应用程序。

以下是我在 build.gradle 中与 spring 相关的依赖项:

根据自动配置报告,是否可以告诉为什么 spring 默认要使用 Jetty 作为响应式引擎(实际上,根据 spring 文档,reactor Netty 是默认引擎)

spring boot 自动配置报告(摘录):

我在应用程序启动期间遇到的异常:

我怎样才能让Spring使用reactor netty?

0 投票
2 回答
1391 浏览

spring - 在 Spring Webflux 中修改/覆盖/扩展内置 Jackson 2 ObjectMapper 的建议方法是什么?

目前我有一个带有 Jackson 库的简约Spring / NettyReactor / Web Flux项目

构建.gradle:

控制器类工作正常(它返回Mono<>一个 DTO 类型)。因为 Jackson 存在于类路径中,所以Web Flux会自动创建一个 Object Mapper 实例,DefaultServerCodecConfigurer但是不清楚如何覆盖对象映射器实例,因为大多数Web Flux配置类都是包私有的。

我想要实现的是创建自己的对象映射器以添加在jackson-modules-java8 LocalDateTime中实现的自定义序列化

问题是不清楚如何修改Jackson2JsonEncoder在包 private 中创建的org.springframework.http.codec.support.AbstractCodecConfigurer.AbstractDefaultCodecs

0 投票
2 回答
1525 浏览

spring - spring webflux: purely functional way to attach websocket adapter to reactor-netty server

I am not able to figure out a way to attach a WebSocketHandlerAdapter to a reactor netty server.

Requirements: I want to start a reactor netty server and attach http (REST) endpoints and websocket endpoints to the same server. I have gone through the documentation and some sample demo application mentioned in the documentation. They show how to attach a HttpHandlerAdapter to the the HttpServer using newHandler() function. But when it comes to websockets they switch back to using spring boot and annotation examples. I am not able to find how to attach websockets using functional endpoints.

Please point me in the right direction on how to implement this. 1. how do I attach the websocket adapter to the netty server? 2. Should I use HttpServer or TcpServer?

Note: 1. I am not using spring boot. 2. I am not using annotations. 3. Trying to achieve this only using functional webflux end points.

Sample code:

0 投票
3 回答
18603 浏览

spring-boot - Spring WebFlux:只允许一个连接接收订阅者

我正在用 Spring 5 Webflux 和 Kotlin 编写一个简单的应用程序。我正在尝试通过以下方式实现 PUT 端点:

保存的技巧是我尝试从项目中读取城市名称,解析地理坐标,在原始项目中覆盖它们,然后使用 Spring Data Mongo Reactive repo 保存到 Mongo。

解析地理坐标的代码在这里:

问题是,如果发出 PUT 请求,我会得到以下堆栈跟踪。我尝试使用val geo = Mono.just(Geo(0.0, 0.0))(不使用 WebClient)存根 Mono,然后它工作正常。

如何在不牺牲功能的情况下修复它?)

0 投票
0 回答
937 浏览

docker - 在 docker 容器中运行 webflux 时,Netty 加载异常

该应用程序在本地系统中运行良好,但我在 docker 中运行它时失败了。

dockerfile 在这里

在 Docker 中启动此服务时,控制台中出现以下错误。

0 投票
5 回答
8112 浏览

java - Spring Cloud Gateway:修改后的响应正文被截断

我一直在尝试使用 Spring Cloud Gateway,并且正在尝试修改响应正文。使用响应装饰器,我可以看到主体被修改,但是,缓冲区大小仍然是原始响应的大小。有没有办法将缓冲区大小扩展到新响应主体的大小?

示例: 预期的重写响应为0123456789abcdefgIf original content is 11 bytes <p>test</p>,则重写响应被截断为0123456789a