You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 01:07:44