有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ScheduledExecutorService停止随机运行

我有一个使用discordjdaapi的相当复杂的bot,为了让我的定期检查程序检查状态变化,我有一个ScheduledExecutorService。问题是,当我向机器人输入命令时,会出现随机(?)服务停止工作的机会,使整个程序没有响应,stacktrace中没有任何错误。我通过放置一个简单的计时器计数器推断出这一点,它似乎只是随机停止(不是真的,更像是它没有确定的模式)。这是检查器的类别:


import net.dv8tion.jda.core.JDA;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.User;
import us.verif.bot.sql.Sql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class PeriodicCheck implements Runnable {
    int i = 0;
    private JDA jda;

    public PeriodicCheck(JDA jda) {
        this.jda = jda;
    }


    public void run() {
        i++;
        System.out.println(i);
        try {
            Connection connection = DataSource.getConnection();
            connection.setCatalog("verifus");
            PreparedStatement preparedStatement = connection.prepareStatement("select * from `activatedservers` where `expireDate` <= NOW()");
            ResultSet rs = preparedStatement.executeQuery();

            while (rs.next()) {
                String guildId = Config.getGuildId();
                User user = jda.getGuildById(guildId).getOwner().getUser();
                String server = jda.getGuildById(guildId).getName();
                user.openPrivateChannel().queue((channel) -> channel.sendMessage("Your Verifus activation for your server `" + server + "` has expired. \nVisit https://verif.us/ to purchase.").queue());
            }
            connection.close();
            Sql.deleteExpiredGuilds();

            Connection connection1 = DataSource.getConnection();
            connection1.setCatalog(Config.getGuildId());
            PreparedStatement preparedStatement1 = connection1.prepareStatement("select * from `verifiedusers` where `expireDate` <= NOW()");
            ResultSet rs1 = preparedStatement1.executeQuery();
            while (rs1.next()) {
                User user = jda.getUserById(rs1.getString("discordId"));
                String serverName = jda.getGuildById(Config.getGuildId()).getName();
                Guild guild = jda.getGuildById(Config.getGuildId());
                String role = rs1.getString("roleId");
                user.openPrivateChannel().queue((channel) -> channel.sendMessage("Your role `" + jda.getRoleById(role).getName() + "` in the server `" + serverName + "` has expired.").queue());
                guild.getController().removeSingleRoleFromMember(guild.getMemberById(rs1.getString("discordId")), jda.getRoleById(role)).queue();
            }
            connection1.close();
            Sql.deleteExpiredUsers();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

下面是启动服务的主类的一部分:

        PeriodicCheck periodicCheck = new PeriodicCheck(api);
        ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        try {
            scheduledExecutorService.scheduleAtFixedRate(periodicCheck, 0, 1, TimeUnit.SECONDS);
        } catch (Exception e) {
            e.printStackTrace();
        }

如果我在做这些的时候没有弄错的话,那么我很确定我的程序中的其他地方导致了这种情况,这将很难找到
请注意,以前我使用TimerTask而不是ScheduledExecutorService时确实发生过这种情况,这是因为我没有关闭SQL连接,但我确保在代码中关闭所有连接

如果没有出现任何问题,我可以提供更多的程序类,尽管我不知道是哪个类导致了它,因为每个命令都是随机发生的。可能是因为我的电脑/互联网吗?我在家里用我的个人电脑来测试

我的checker类中还有两个未明确说明的其他方法,它们是: Sql.deleteExpiredGuilds

        try {
            Connection connection = DataSource.getConnection();
            connection.setCatalog("verifus");
            connection.prepareStatement("delete from activatedservers where expireDate <= NOW()").executeUpdate();
            connection.close();
        } catch (SQLException e) { e.printStackTrace(); }
    }

Sql.deleteExpiredUsers

        try {
            Connection connection = DataSource.getConnection();
            connection.setCatalog(Config.getGuildId());
            connection.prepareStatement("delete from verifiedusers where expireDate <= NOW()").executeUpdate();
            connection.close();
        } catch (SQLException e) { e.printStackTrace(); }
    }

共 (0) 个答案