Quarkus中用Discord4J开发Discord Bot遇UnknownHostException求助
解决Quarkus + Discord4J启动时的UnknownHostException问题
1. 强制使用IPv4解析域名
JVM的DNS解析逻辑可能和系统层面存在差异,即使本地ping正常,也可能出现IPv6解析失败导致的异常。在application.properties中添加以下配置强制JVM仅使用IPv4:
quarkus.prefer-ipv4-stack=true
2. 排查Quarkus开发模式的网络限制
Quarkus开发模式默认的安全策略或服务发现逻辑可能干扰网络请求,可尝试:
- 打包为可执行Jar脱离开发模式运行,验证问题是否消失:
./mvnw package -Dquarkus.package.type=uber-jar java -jar target/your-project-name-runner.jar - 若仅开发模式下出现问题,添加配置关闭开发模式的自动服务发现:
quarkus.dev.services.enabled=false
3. 自定义Discord4J的HTTP客户端DNS配置
Discord4J默认使用Reactor Netty的HTTP客户端,可手动指定DNS服务器绕过系统解析逻辑:
import discord4j.core.DiscordClient; import discord4j.core.GatewayDiscordClient; import reactor.netty.http.client.HttpClient; import reactor.netty.resources.ConnectionProvider; import reactor.netty.transport.AddressResolverGroup; import java.net.InetSocketAddress; // Bot初始化代码中添加自定义HttpClient HttpClient httpClient = HttpClient.create(ConnectionProvider.newConnection()) .resolver(AddressResolverGroup.create(new io.netty.resolver.dns.DnsNameResolverBuilder() .nameserverProvider(() -> InetSocketAddress.createUnresolved("1.1.1.1", 53)))); DiscordClient client = DiscordClient.create("your-bot-token") .withHttpClient(httpClient); GatewayDiscordClient gateway = client.login().block();
4. 禁用JVM DNS缓存
JVM默认会缓存DNS解析结果,若缓存了错误记录也会导致异常。启动Quarkus时添加以下JVM参数:
./mvnw quarkus:dev -Dsun.net.inetaddr.ttl=0 -Dnetworkaddress.cache.ttl=0
内容的提问来源于stack exchange,提问作者Voxel
相关产品推荐
相关产品推荐

