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()获取客户端,但没有添加阻塞逻辑维持应用运行。
具体修复步骤:
- 修改
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; }
- 补充
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.
相关产品推荐
相关产品推荐

