Quarkus环境中Discord4J机器人无法解析discord.com域名的问题排查求助
Quarkus环境中Discord4J机器人无法解析discord.com域名的问题排查求助
问题概述
- 直接用Java主类运行Discord4J机器人:一切正常
- 作为Quarkus主程序的一部分运行:无法解析discord.com的DNS
背景信息
我尝试让Discord4J在Quarkus环境中运行,但遇到了报错。
先是跟着Discord4J的基础机器人教程做,用普通Java主类运行完全没问题。之后我把DiscordClient改成了Quarkus的Bean,结果就出问题了——Reactor Netty突然无法解析discord.com域名了(堆栈信息在下方)。
Quarkus版本的代码和普通主类调用的是同一套逻辑,唯一的区别是Discord令牌从@ConfigMapping注入而不是硬编码,但注入的值是正确的。
已尝试的解决方法
- 按照一个相关问题的建议强制指定ReactorResource,但没有解决问题
- 也试了Quarkus的Discord4J扩展,结果遇到了同样的问题——这说明可能不是一直存在的问题,也许和Quarkus的版本更新有关(该扩展的pom显示最后测试用的是Quarkus 3.7,大概是一年前的版本)
我的疑问
我猜测Quarkus(或者Mutiny?)自定义了Netty(或者Reactor Netty?)的配置,但找不到具体细节,也不知道为什么会导致这个错误。
有没有人能帮忙分析一下或者给个排查方向?
任何线索都感激不尽,我对Quarkus的内部机制不够熟悉,不知道从哪里开始查起。提前谢谢大家!
技术栈
- Discord4J 3.2.7
- Quarkus 3.18.1(为了测试/排查只引入了ArC)
- Java 21
附加:堆栈跟踪
精简版
2025-02-12 22:07:18,136 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi] 2025-02-12 22:07:19,424 INFO [dis.cor.DiscordClientBuilder] (Quarkus Main Thread) Discord4J 3.2.6-5-g501ec30 (https://discord4j.com) 2025-02-12 22:07:19,897 WARN [io.net.res.dns.DefaultDnsServerAddressStreamProvider] (d4j-limiter-1) Default DNS servers: [/[2001:4860:4860:0:0:0:0:8888]:53, /[2001:4860:4860:0:0:0:0:8844]:53] (Google Public DNS as a fallback) 2025-02-12 22:07:20,153 ERROR [io.qua.run.Application] (Quarkus Main Thread) Failed to start application Exception in DiscordConfiguration.java:76 74 }); 75 → 76 login.block(); 77 return client; 78 } ... : reactor.core.Exceptions$ReactiveException: java.net.UnknownHostException: Failed to resolve 'discord.com' [A(1)] after 2 queries at reactor.core.Exceptions.propagate(Exceptions.java:396) at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:97) at reactor.core.publisher.Mono.block(Mono.java:1742) ... Caused by: java.net.UnknownHostException: Failed to resolve 'discord.com' [A(1)] after 2 queries at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1150) Suppressed: The stacktrace has been enhanced by Reactor, refer to additional information below: Error has been observed at the following site(s): *__checkpoint ⇢ Request to GET /gateway/bot [RequestStream] *__checkpoint ⇢ Request to GET /gateway/bot [DefaultRouter] Original Stack Trace: at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1150) at io.netty.resolver.dns.DnsResolveContext.tryToFinishResolve(DnsResolveContext.java:1097) at io.netty.resolver.dns.DnsResolveContext.query(DnsResolveContext.java:455) at io.netty.resolver.dns.DnsResolveContext.access$700(DnsResolveContext.java:70) at io.netty.resolver.dns.DnsResolveContext$2.operationComplete(DnsResolveContext.java:524) ... Caused by: io.netty.resolver.dns.DnsNameResolverException: [223: /[2001:4860:4860:0:0:0:0:8844]:53] DefaultDnsQuestion(discord.com. IN A) failed to send a query '223' via UDP (no stack trace available) Caused by: java.net.SocketException: Network is unreachable: sendto at java.base/sun.nio.ch.DatagramChannelImpl.send0(Native Method) at java.base/sun.nio.ch.DatagramChannelImpl.sendFromNativeBuffer(DatagramChannelImpl.java:1005) at java.base/sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:966) at java.base/sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:889) at io.netty.channel.socket.nio.NioDatagramChannel.doWriteMessage(NioDatagramChannel.java:297) ... 2025-02-12 22:07:20,200 INFO [io.quarkus] (Quarkus Main Thread) mybot stopped in 0.011s
完整版
2025-02-12 22:07:18,129 INFO [io.quarkus] (Quarkus Main Thread) mybot 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.18.1) started in 2.662s. 2025-02-12 22:07:18,136 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated. 2025-02-12 22:07:18,136 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi] 2025-02-12 22:07:19,424 INFO [dis.cor.DiscordClientBuilder] (Quarkus Main Thread) Discord4J 3.2.6-5-g501ec30 (https://discord4j.com) 2025-02-12 22:07:19,897 WARN [io.net.res.dns.DefaultDnsServerAddressStreamProvider] (d4j-limiter-1) Default DNS servers: [/[2001:4860:4860:0:0:0:0:8888]:53, /[2001:4860:4860:0:0:0:0:8844]:53] (Google Public DNS as a fallback) 2025-02-12 22:07:20,153 ERROR [io.qua.run.Application] (Quarkus Main Thread) Failed to start application Exception in DiscordConfiguration.java:76 74 }); 75 → 76 login.block(); 77 return client; 78 } Exception in DiscordConfiguration.java:30 28 log.debug("Producing Discord bot"); 29 → 30 return buildDiscordClient(config.token()); 31 } 32 : reactor.core.Exceptions$ReactiveException: java.net.UnknownHostException: Failed to resolve 'discord.com' [A(1)] after 2 queries at reactor.core.Exceptions.propagate(Exceptions.java:396) at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:97) at reactor.core.publisher.Mono.block(Mono.java:1742) at org.keyboardplaying.labs.discord.config.DiscordConfiguration.buildDiscordClient(DiscordConfiguration.java:76) at org.keyboardplaying.labs.discord.config.DiscordConfiguration.produceBot(DiscordConfiguration.java:30) at org.keyboardplaying.labs.discord.config.DiscordConfiguration_ProducerMethod_produceBot_aihjzrC3vxo3N-4V44lsyBRtCpQ_Bean.doCreate(Unknown Source) at org.keyboardplaying.labs.discord.config.DiscordConfiguration_ProducerMethod_produceBot_aihjzrC3vxo3N-4V44lsyBRtCpQ_Bean.create(Unknown Source) at org.keyboardplaying.labs.discord.config.DiscordConfiguration_ProducerMethod_produceBot_aihjzrC3vxo3N-4V44lsyBRtCpQ_Bean.create(Unknown Source) at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:119) at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:38) at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:35) at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:32) at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69) at io.quarkus.arc.impl.ComputingCacheContextInstances.computeIfAbsent(ComputingCacheContextInstances.java:19) at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:35) at org.keyboardplaying.labs.discord.config.DiscordConfiguration_ProducerMethod_produceBot_aihjzrC3vxo3N-4V44lsyBRtCpQ_Bean.get(Unknown Source) at org.keyboardplaying.labs.discord.config.DiscordConfiguration_ProducerMethod_produceBot_aihjzrC3vxo3N-4V44lsyBRtCpQ_Bean.get(Unknown Source) at org.keyboardplaying.labs.HabotApplication_Bean.doCreate(Unknown Source) at org.keyboardplaying.labs.HabotApplication_Bean.create(Unknown Source) at org.keyboardplaying.labs.HabotApplication_Bean.create(Unknown Source) at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:119) at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:38) at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:35) at io.quarkus.arc.generator.Default_jakarta_enterprise_context_ApplicationScoped_ContextInstances.c0(Unknown Source) at io.quarkus.arc.generator.Default_jakarta_enterprise_context_ApplicationScoped_ContextInstances.computeIfAbsent(Unknown Source) at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:35) at io.quarkus.arc.impl.ClientProxies.getApplicationScopedDelegate(ClientProxies.java:23) at org.keyboardplaying.labs.HabotApplication_ClientProxy.arc$delegate(Unknown Source) at org.keyboardplaying.labs.HabotApplication_ClientProxy.run(Unknown Source) at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:143) at io.quarkus.runtime.Quarkus.run(Quarkus.java:77) at io.quarkus.runtime.Quarkus.run(Quarkus.java:48) at io.quarkus.runner.GeneratedMain.main(Unknown Source) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at io.quarkus.runner.bootstrap.StartupActionImpl$1.run(StartupActionImpl.java:116) at java.base/java.lang.Thread.run(Thread.java:1583)
备注:内容来源于stack exchange,提问作者Chop
相关产品推荐
相关产品推荐

