java.net.UnknownHostException:在 Quarkus 中使用 discord4j 进行 4 次查询后,无法解析“discord.com”[A(1), AAAA(28)]”

问题描述 投票:0回答:1

我目前正在按照 this 指南使用 Java 创建我的第一个 Discord 机器人。 我有一个使用 mvn 包装器设置的 Quarkus 应用程序 (V3.6.6)。我已将discord4j包添加到我的pom.xml

<dependency>
  <groupId>com.discord4j</groupId>
  <artifactId>discord4j-core</artifactId>
  <version>3.2.6</version>
</dependency>

我创建了一个接口,以便能够访问我的代码中的应用程序属性

import io.smallrye.config.ConfigMapping;

@ConfigMapping(prefix = "discord")
public interface IdiscordBot {

    String token();
    String clientId();
    String clientSecret();
    
}

我的 application.properties 看起来像这样:

discord.token=${DISCORD_API_TOKEN}
discord.client-id=${YOUR_DISCORD_CLIENT_ID}
discord.client-secret=${YOUR_DISCORD_CLIENT_SECRET}

我的实际机器人看起来像这样

package bots;

import discord4j.core.DiscordClient;
import discord4j.core.GatewayDiscordClient;
import discord4j.core.event.domain.message.MessageCreateEvent;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.inject.Inject;
import jakarta.ws.rs.Path;
import io.quarkus.runtime.StartupEvent;

@ApplicationScoped
@Path("/discord")
public class DiscordBot {

    @Inject
    IdiscordBot discordBot;

    void onStart(@Observes StartupEvent ev)
    {
        DiscordClient client = DiscordClient.create(discordBot.token());
        GatewayDiscordClient gateway = client.login().block();
    
        gateway.on(MessageCreateEvent.class).subscribe(event -> {
                String content = event.getMessage().getContent();
                if ("!ping".equals(content)) {
                        event.getMessage().getChannel().block().createMessage("Pong!").block();
                    }
                });
            
                gateway.onDisconnect().block();
    }
}

如果我运行这个,我会得到:

2024-02-01 18:33:10,075 INFO  [dis.cor.DiscordClientBuilder] (Quarkus Main Thread) Discord4J 3.2.6 (https://discord4j.com)
2024-02-01 18:33:10,165 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)
2024-02-01 18:33:10,268 ERROR [io.qua.run.Application] (Quarkus Main Thread) Failed to start application (with profile [dev]): java.lang.RuntimeException: Failed to start quarkus
        at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
        at io.quarkus.runtime.Application.start(Application.java:101)
        at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:111)
        at io.quarkus.runtime.Quarkus.run(Quarkus.java:71)
        at io.quarkus.runtime.Quarkus.run(Quarkus.java:44)
        at io.quarkus.runtime.Quarkus.run(Quarkus.java:124)
        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:113)
        at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: reactor.core.Exceptions$ReactiveException: java.net.UnknownHostException: Failed to resolve 'discord.com' [A(1), AAAA(28)] after 4 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 bots.DiscordBot.onStart(DiscordBot.java:24)
        at bots.DiscordBot_Observer_onStart_HOQkuT2M7cTKdLxHQb6PsFBzQ4I.notify(Unknown Source)
        at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:346)
        at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:328)
        at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:82)
        at io.quarkus.arc.runtime.ArcRecorder.fireLifecycleEvent(ArcRecorder.java:157)
        at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:108)
        at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy_0(Unknown Source)
        at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy(Unknown Source)
        ... 11 more
        Suppressed: java.lang.Exception: #block terminated with an error
                at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:99)
                ... 21 more
Caused by: java.net.UnknownHostException: Failed to resolve 'discord.com' [A(1), AAAA(28)] after 4 queries
        at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1097)
        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:1097)
                ...
                at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
                at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: io.netty.resolver.dns.DnsNameResolverException: [33311: /[2001:4860:4860:0:0:0:0:8844]:53] DefaultDnsQuestion(discord.com. IN AAAA) failed to send a query '33311' 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 io.netty.channel.socket.nio.NioDatagramChannel.doWriteMessage(NioDatagramChannel.java:297)
        ...
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:1583)

如果我运行 nslookup Discord.com 或尝试对其进行 ping 操作,命令将按预期运行。 我尝试将我的 DNS 解析器设置为 Google 和 Cloudflare,但这并没有改变任何东西。

是否缺少配置?这是 IPV4/IPV6 的事情吗?或者这对 Quarkus 和/或开发模式下的 Quarkus 不起作用。 不幸的是,我找不到任何有帮助的东西。

java maven quarkus discord4j
1个回答
0
投票

这是 netty 和reactor-netty 的问题。您可以通过强制使用默认解析器来修复它:

ReactorResources reactor = ReactorResources.builder()
        .httpClient(ReactorResources.DEFAULT_HTTP_CLIENT.get()
                .resolver(DefaultAddressResolverGroup.INSTANCE))
        .build();
GatewayDiscordClient gateway = DiscordClient.builder(discordBot.token())
        .setReactorResources(reactor)
        .build()
        .login()
        .block();
© www.soinside.com 2019 - 2024. All rights reserved.