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

Spring整合Discord4J机器人启动后自动停止问题求助

Discord4J + Spring Boot 机器人连接后立即停止运行

我基于Spring Boot框架,使用Discord4J开发Discord机器人。启动应用后,机器人能成功连接Discord,但随即就停止运行了。我参照了近期的教程,教程里的代码实现和我的完全一致且能正常运行,却找不到问题出在哪里。

项目代码

GodCreatorApplication类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class GodCreatorApplication {

    public static void main(String[] args) {
        SpringApplication.run(GodCreatorApplication.class, args);
    }

}

BotConfiguration配置类

import discord4j.core.DiscordClientBuilder;
import discord4j.core.GatewayDiscordClient;
import discord4j.core.event.domain.Event;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

@Configuration
public class BotConfiguration {
    @Value("${discord.token}")
    private String token;

    @Bean
    public <T extends Event> GatewayDiscordClient gatewayDiscordClient(List<EventListener<T>> eventListeners) {
        GatewayDiscordClient client = DiscordClientBuilder.create(token)
                .build()
                .login()
                .block();

        for(EventListener<T> listener : eventListeners) {
            assert client != null;
            client.on(listener.getEventType())
                    .flatMap(listener::execute)
                    .onErrorResume(listener::handleError)
                    .subscribe();
        }

        return client;
    }
}

MessageListener抽象类

import discord4j.core.object.entity.Message;
import reactor.core.publisher.Mono;

public abstract class MessageListener {

    public Mono<Void> processCommand(Message eventMessage) {
        return Mono.just(eventMessage)
                .filter(message -> message.getAuthor().map(user -> !user.isBot()).orElse(false))
                .filter(message -> message.getContent().equalsIgnoreCase("!todo"))
                .flatMap(Message::getChannel)
                .flatMap(channel -> channel.createMessage("Things to do today:\n - write a bot\n - eat lunch\n - play a game"))
                .then();
    }
}

MessageCreateListener类

import discord4j.core.event.domain.message.MessageCreateEvent;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;

@Service
public class MessageCreateListener extends MessageListener implements EventListener<MessageCreateEvent> {

    @Override
    public Class<MessageCreateEvent> getEventType() {
        return MessageCreateEvent.class;
    }

    @Override
    public Mono<Void> execute(MessageCreateEvent event) {
        return processCommand(event.getMessage());
    }
}

运行结果

运行结果


问题原因及解决办法

机器人连接后立即停止的核心原因是:Spring Boot应用完成Bean初始化后,主线程直接退出,导致整个应用终止,Discord网关连接随之断开。虽然你调用了client.login().block()获取客户端,但没有添加阻塞逻辑维持应用运行。

具体修复步骤:

  1. 修改BotConfiguration的gatewayDiscordClient方法,添加阻塞逻辑防止应用退出:
@Bean
public <T extends Event> GatewayDiscordClient gatewayDiscordClient(List<EventListener<T>> eventListeners) {
    GatewayDiscordClient client = DiscordClientBuilder.create(token)
            .build()
            .login()
            .block();

    assert client != null;
    for(EventListener<T> listener : eventListeners) {
        client.on(listener.getEventType())
                .flatMap(listener::execute)
                .onErrorResume(listener::handleError)
                .subscribe();
    }

    // 阻塞主线程直到Discord连接断开,维持应用运行
    client.onDisconnect().block();
    return client;
}
  1. 补充MessageCreateListener的错误处理方法:你实现了EventListener但未重写handleError,会导致运行时异常,补充该方法:
@Service
public class MessageCreateListener extends MessageListener implements EventListener<MessageCreateEvent> {

    @Override
    public Class<MessageCreateEvent> getEventType() {
        return MessageCreateEvent.class;
    }

    @Override
    public Mono<Void> execute(MessageCreateEvent event) {
        return processCommand(event.getMessage());
    }

    @Override
    public Mono<Void> handleError(Throwable error) {
        // 可根据需求添加日志记录
        System.err.println("消息事件处理出错:" + error.getMessage());
        return Mono.empty();
    }
}

修改完成后,机器人连接Discord后会保持在线,直到主动关闭应用或连接异常断开。

内容的提问来源于stack exchange,提问作者Vincent B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:06:20