当前位置: 首页 > 知识库问答 >
问题:

如何处理Reactor Netty中的io.Netty.channel.ConnectTimeoutException

卓星波
2023-03-14

我正在尝试使用Reactor Netty TcpClient以反应方式与主机交互,这可能是无法访问的。下面是通道初始化逻辑的示例:

ConnectionProvider connectionProvider = ConnectionProvider.fixed("fixed", 50);
TcpClient.create(connectionProvider)
  .host(host).port(port)
  .wiretap(true)
  .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 50)
  .doOnConnect(x -> log.trace("Connect to {}:{}", host, port))
  .doOnConnected(conn -> log.trace("Connected {}", conn.channel()))
  .connect()
  .subscribe(this::utilizeConnection);

我收到的输出:

2019-09-04 08:23:13.612 TRACE 71988 --- [ioEventLoop-4-3] c.c.pcb.poc.network.tcp.NettyTcpSender   : Connect to 192.168.88.210:2000
2019-09-04 08:23:13.684  WARN 71988 --- [actor-tcp-nio-4] io.netty.util.concurrent.DefaultPromise  : An exception was thrown by reactor.netty.resources.PooledConnectionProvider$DisposableAcquire.operationComplete()

reactor.core.Exceptions$ErrorCallbackNotImplemented: io.netty.channel.ConnectTimeoutException: connection timed out: /192.168.88.210:2000
Caused by: io.netty.channel.ConnectTimeoutException: connection timed out: /192.168.88.210:2000
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe$1.run(AbstractNioChannel.java:267) ~[netty-transport-4.1.36.Final.jar:4.1.36.Final]
    at io.netty.util.concurrent.PromiseTask$RunnableAdapter.call(PromiseTask.java:38) ~[netty-common-4.1.36.Final.jar:4.1.36.Final]
    at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:127) ~[netty-common-4.1.36.Final.jar:4.1.36.Final]
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) [netty-common-4.1.36.Final.jar:4.1.36.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:405) [netty-common-4.1.36.Final.jar:4.1.36.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500) [netty-transport-4.1.36.Final.jar:4.1.36.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906) [netty-common-4.1.36.Final.jar:4.1.36.Final]
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [netty-common-4.1.36.Final.jar:4.1.36.Final]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_181]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Assembly trace from producer [reactor.core.publisher.MonoCreate] :
    reactor.core.publisher.Mono.create(Mono.java:183)
    reactor.netty.resources.PooledConnectionProvider.acquire(PooledConnectionProvider.java:130)
Error has been observed by the following operator(s):
    |_  Mono.create ⇢ reactor.netty.resources.PooledConnectionProvider.acquire(PooledConnectionProvider.java:130)
    |_  Mono.doOnSubscribe ⇢ reactor.netty.tcp.TcpClientDoOn.connect(TcpClientDoOn.java:58)

“inbound”和“outbound”有一个专门的方法来处理它们的错误,但是它们工作在一个连接实例之上,如果您得到“Connection timeout”,则不会创建该连接实例

我试过:

>

  • 异常,我接收到的异常包装在“ErrorCallBacKnotImplemented”中。但我找不到任何实现“错误回调”的方法

    该日志包含来自“io.netty.util.concurrent.DefaultPromise”的警告消息。但我没有办法做出自己的承诺,以正确的方式处理它。

    没有任何配置,我发现,可能以某种方式拦截连接超时。

    变通办法。创建连接的阻塞方法(.block()而不是.subscribe())将允许我捕获在普通try-catch块中创建异常的任何连接,但这样的解决方法将使我失去反应方法的好处。

    是否有人至少会给我一些建议,以帮助我找到处理'IO.Netty.Channel.ConnectTimeoutException'的正确方法?

  • 共有1个答案

    慕迪
    2023-03-14

    通常,在基于labmda的.subscribe方法上进行订阅时(monoflux)会发生reactor.core.exceptions$errorcallbacknotimlemented

    如果您打算查看这里和这里的源代码,您会发现reactor.core.exceptions$errorcallbacknotimlemented被抛出的地方!

    为了处理原始的io.netty.channel.ConnectTimeoutException,我建议查看原始Project Reactor文档的处理错误部分

     类似资料:
    • 问题内容: 在开发高度基于XML的Java应用程序时,我最近在Ubuntu Linux上遇到了一个有趣的问题。 我的应用程序使用Java Plugin Framework ,似乎无法将dom4j创建的XML文档转换为Batik的 SVG规范实现。 在控制台上,我了解到发生了错误: 我认为问题是由来自JVM的原始类加载器与插件框架部署的类加载器之间的冲突引起的。 据我所知,不可能为框架指定一个类加载

    • 问题内容: 在开发一个高度基于XML的Java应用程序时,我最近在Ubuntu Linux上遇到了一个有趣的问题。 我的应用程序使用Java Plugin Framework ,似乎无法将dom4j创建的XML文档转换为Batik的 SVG规范实现。 在控制台上,我了解到发生了错误: 我认为问题是由JVM的原始类加载器与插件框架部署的类加载器之间的冲突引起的。 据我所知,不可能为框架指定一个类加载

    • 问题内容: 背景 我刚刚将熊猫从0.11升级到0.13.0rc1。现在,该应用程序会弹出许多新警告。其中之一是这样的: 我想知道这到底是什么意思?我需要改变什么吗? 如果我坚持使用该如何警告quote_df[‘TVol’] = quote_df[‘TVol’]/TVOL_SCALE? 产生错误的功能 更多错误讯息 问题答案: 在SettingWithCopyWarning被创造的标志可能造成混淆的

    • 本文向大家介绍如何处理硒中的帧?,包括了如何处理硒中的帧?的使用技巧和注意事项,需要的朋友参考一下 我们可以借助以下方法来处理Selenium中的帧- switchTo()。frame(frameNumber) 此方法使用帧ID作为参数。框架ID的索引从0开始。如果未找到框架,则会引发NoSuchFrameException。 switchTo()。frame(frameName) 此方法使用开发

    • 我正在探索AWS Kinesis的数据处理要求,该要求用基于流的方法取代旧的批处理ETL处理。 该项目的关键要求之一是在以下情况下重新处理数据的能力: 发现并修复错误,然后重新部署应用程序。数据需要从一开始就重新处理 这里很好地记录了Kafka-https://cwiki.apache.org/confluence/display/KAFKA/Kafka流数据(重新)处理场景的场景。 我在Kine

    • 本文向大家介绍如何在Java中处理Selenium中的代理?,包括了如何在Java中处理Selenium中的代理?的使用技巧和注意事项,需要的朋友参考一下 我们可以借助PROXY类在Java中使用Selenium处理代理。