问题标签 [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.
spring-boot - 如何自定义 websocket 握手和/或添加过滤器?
我需要以某种方式验证 websocket 请求。
有没有办法使用带有reactor-netty的spring webflux来实现?
- spring-boot 2.0.5.Release
- 反应堆-netty 0.7.9.Release
netty - 通过 Spring Websocket STOMP 打开连接会导致我们的服务器死机
所以我们在后端使用 Spring websocket STOMP + RabbitMQ,我们在打开文件描述符时遇到了问题。一段时间后,我们达到了服务器的限制,服务器不接受任何连接,包括 websocket 和 API 端点。
我们得到以下例外:
linux 的默认文件描述符限制是 1024,即使我们将其增加到 65000 之类的东西,无论如何它都会在某个时候达到限制。
我们想从后端解决这个问题,最好是通过 Spring 而没有任何变通方法。有任何想法吗?
更新
RabbitMQ 和应用程序驻留在不同的服务器上。实际上,RabbitMQ 在 Compose 上工作。我们可以通过不从客户端发送DISCONNECT消息来重现此问题。
更新 2
今天我意识到,无论发生什么,所有的文件描述符和 java 线程总是留在那里。我已经实现了一种解决方法,包括从 Spring 发送DISCONNECT消息并关闭WebSocketSession
对象并且不进行任何更改。我通过检查以下链接实现了这些:
- 从 Spring websocket stomp 服务器断开客户端会话
- https://github.com/isaranchuk/spring-websocket-disconnect
- https://github.com/rstoyanchev/spring-websocket-portfolio
作为旁注,服务器端发送这样的消息:
simpMessagingTemplate.convertAndSend("/queue/" + sessionId, payload)
. 这样,我们就保证了每个客户端都得到了相关的消息sessionId.
这是某种错误吗?为什么不关闭文件描述符?以前没有人遇到过这个问题吗?
更新 3
每次关闭套接字时,我都会看到以下异常。无论是通过来自客户端的DISCONNECT消息还是webSocketSession.close()
来自服务器的代码,它是如何关闭的都没有关系。
所以我将日志级别更改为TRACE
,我看到 websocket 确实被关闭了,但是这些异常立即被抛出。所以在这一点上,我真的很怀疑这个例外。挂起的 java 线程的数量总是与 websocket 的数量齐头并进,即创建 400 个 websocket 总是在主进程中最终导致 ~400 个挂起的线程。并且内存资源永远不会被释放。
谷歌搜索此异常仅得到以下 4 个结果:(其余为其他异常)
- https://github.com/netty/netty/issues/2414
- https://github.com/reactor/reactor-ipc/issues/16
- https://github.com/cloudfoundry/cf-java-client/issues/495
- https://github.com/cloudfoundry/cf-java-client/issues/480
将库更新netty
到最新版本(4.1.29.Final)也不起作用,所以我相应地更改了问题的标签。我也在考虑针对netty
. 我已经尝试了很多东西,并在应用程序级别上进行了多次实验,但似乎没有任何效果。在这一点上,我对任何想法都持开放态度。
spring-boot - 在 Spring Boot 反应式 Web 应用程序上启用 SSL 并在控制台中对打印异常噪音进行 http 调用
在我制作了 Spring Boot 反应式 Web 应用程序以支持 SSL 后,当我尝试对服务器进行 http 调用时,它会在控制台中的异常跟踪下方打印。作为应用程序所有者,我无法阻止任何人使用我的服务。但是我应该能够防止在控制台中进行跟踪打印,尤其是在IO 操作成本高昂的反应式 Web 应用程序中。有什么想法可以防止这种情况吗?
编辑 3:
编辑 2:
IO 操作成本高昂的地方我刚刚意识到这可能发生在事件循环线程池之外。所以它可能不会阻塞任何线程。但我仍然喜欢防止它在控制台中打印。
编辑1:
重现步骤
- 签出项目https://github.com/sp13ceg/spring-boot-reative-ssl
- 启动服务器
./gradlew booRun
- 使不安全的 https 调用
curl --insecure https://localhost:8080/hi
正常工作 进行 http 调用
curl http://localhost:8080/hi
,您将在控制台中看到异常。io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record: 474554202f686920485454502f312e310d0a486f73743a206c6f63616c686f73743a383434340d0a557365722d4167656e743a206375726c2f372e35342e300d0a4163636570743a202a2f2a0d0a0d0a at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1178) [netty-handler-4.1.29.Final.jar: 4.1.29.Final] 在 io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1243) [netty-handler-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.handler .codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489) [netty-codec-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:428 ) [netty-codec-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265) [netty-codec-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty .channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [ netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) [netty-transport-4.1.29.Final.jar: 4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.AbstractChannelHandlerContext .invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) [netty-transport-4.1 .29.Final.jar:4.1.29.Final] 在 io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) [netty-transport-4.1.29.Final.jar:4.1.29 .Final] 在 io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:628) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.nio。 NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:563) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:480) [netty -transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:442) [netty-transport-4.1.29.Final.jar:4.1.29.Final] 在 io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) [netty-common-4.1.29. Final.jar:4.1.29.Final] 在 java.lang.Thread.run(Thread.java:748)
spring-webflux - 获取 webflux 事件循环调度器
我将webflux与netty和jdbc一起使用,所以我用下一种方式包装阻塞 jdbc 操作:
阻塞操作将由jdbcScheduler处理,我希望其他管道将由webflux event-loop scheduler 处理。
如何获取 webflux 事件循环调度程序?
java - 如何使用 Netty Reactor 关闭 TcpClient 连接?
我正在尝试关闭来自 netty reactor.ipc.netty.tcp.TcpClient 的 TCP 连接,但我找不到轻松的方法,没有“断开连接”、“停止”或“关闭”方法。谁能帮我?我正在使用 reactor-netty.0.7.9.RELEASE 库。
我的班级结构如下:
感谢您的帮助,非常感谢您提前。
spring - Spring Webflux Netty http 和 https
我有一个要求,在 Spring Webflux 应用程序中,我需要监听 HTTP 和 HTTPS 端口。我可以使用轻松配置 HTTPS
我不确定如何为 Netty 添加 HTTP 侦听器。对于 Tomcat Servlet 模型,我找到了https://dzone.com/articles/enable-httphttps-spring-boot。为 Netty Webflux 寻找类似的设置。
spring-webflux - 泄漏:在垃圾收集之前未调用 ByteBuf.release():LoginFilter
控制台打印:
io.netty.buffer.AdvancedLeakAwareByteBuf.readBytes(AdvancedLeakAwareByteBuf.java:496) org.springframework.core.io.buffer.NettyDataBuffer.read(NettyDataBuffer.java:149) org.springframework.core.io.buffer.NettyDataBuffer.read( NettyDataBuffer.java:38) ipf.gwservice.filter.LoginFilter$1.lambda$writeWith$0(LoginFilter.java:61) reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:107)
错误行:dataBuffer.read(content);
我如何修复它
java - 如何创建 Reactor Netty 热流
我正在尝试找到一种创建热流的方法,我可以在其中以一种方法插入数据,而订阅者可以通过另一种方法获取数据。我已成功使用 a WorkQueueProcessor
,但我不确定这是否是正确的做法。是否可以使用 Flux.create 做同样的事情?这是我的工作片段:
- 称呼
connect();
向服务器发送字节数据,客户端将收到
/li>tcp
服务器的响应并workQueueProcessor
发出数据。
spring-boot - 将 Spring Boot 版本从 2.0.3.RELEASE 更改为 2.1.0.M4 时出现问题
当我将 Spring Boot 版本从 2.0.3.RELEASE 更改为 2.1.0.M4 时,我有一个工作代码停止工作
错误是:
已经提出了一个类似的问题(将 Spring Boot 版本从 2.0.3.RELEASE 更改为 2.1.0.BUILD-SNAPSHOT 时出现问题),但没有给出正确的答案。
以下是我的 POM.xml
我在几个部分上加了星号。父 BOM在其 POM 中有一个父元素,如下所示:
进步
从 spring 2.1.0 M1 发行说明(https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1.0-M1-Release-Notes)我看到 Bean Overriding 已被禁用.
当我在 application.yml 文件中添加属性allow-bean-definition-overriding: true时错误消失,但随后出现以下错误: