Завершение работы ScheduledExecutorService - PullRequest
1 голос
/ 02 августа 2020

Итак, у меня есть Discord-бот, которому я пытаюсь отправлять сообщения каждый час. Я получил эту часть работы, используя службу запланированного исполнителя. Он начинается, когда я говорю! Futureson

Я хочу иметь возможность останавливать его, когда я отправляю! Futuresoff

Однако я не могу заставить это работать должным образом. Вот мой код:

    String[] args = event.getMessage().getContentRaw().split(" ");
    if (args[0].equalsIgnoreCase("!futuresOn")) {
    Color red = new Color(255, 0, 0);
    Color green = new Color(0, 204, 0);
       Runnable futRun = new Runnable() {
       public void run() {
        EmbedBuilder futuresBot = new EmbedBuilder();
        futuresBot.setAuthor("Futures Bot", null, event.getAuthor().getAvatarUrl());
   
        try {
    futuresBot.addField("**S&P 500**", getSPY(), false);
    futuresBot.addField("**NASDAQ**", getNASDAQ(), false);
    futuresBot.addField("**DOW**", getDOW(), false);
    if (getSPY().contains("+")) {
    futuresBot.setColor(green);
    } 
    else {
    futuresBot.setColor(red);
    }
        }
    catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
   
   
        futuresBot.setFooter("Cantina Capital", event.getGuild().getIconUrl());
        event.getChannel().sendMessage(futuresBot.build()).queue();
   
       }
      
    };
    
    exec.scheduleAtFixedRate(futRun, 0, 1, TimeUnit.HOURS);
    
    
    }
    if (args[0].equalsIgnoreCase("!futuresoff")) {
    event.getChannel().sendMessage("Futures bot off.").queue();
    exec.shutdownNow();
    }

Я пробовал это несколькими разными способами, но не могу заставить его работать должным образом. Он переходит к части! Futuresoff, потому что отправляет сообщение боту Futures. Я просто хочу, чтобы он мог отправлять сообщение один раз в час, когда отправлено! Futureson, а не когда отправлено! Futuresoff. Я также попробовал ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(0);

Я был бы признателен за любую помощь или кого-нибудь, кто мог бы указать мне в правильном направлении.

1 Ответ

1 голос
/ 02 августа 2020

Сначала вы должны сохранить результат scheduleAtFixedRate() внутри вашего класса Listener.

ScheduledFuture scheduledFuture = null;

Затем вы можете использовать cancel() на этом объекте, чтобы остановить его. Вы также должны проверить, является ли он нулевым перед планированием, и проверить, установлен ли он перед отменой:

String[] args = event.getMessage().getContentRaw().split(" ");
if (args[0].equalsIgnoreCase("!futuresOn")) {
    Color red = new Color(255, 0, 0);
    Color green = new Color(0, 204, 0);
    Runnable futRun = new Runnable() {
        public void run() {
            EmbedBuilder futuresBot = new EmbedBuilder();
            futuresBot.setAuthor("Futures Bot", null, event.getAuthor().getAvatarUrl());

            try {
                futuresBot.addField("**S&P 500**", getSPY(), false);
                futuresBot.addField("**NASDAQ**", getNASDAQ(), false);
                futuresBot.addField("**DOW**", getDOW(), false);
                if (getSPY().contains("+")) {
                    futuresBot.setColor(green);
                }
                else {
                    futuresBot.setColor(red);
                }
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            futuresBot.setFooter("Cantina Capital", event.getGuild().getIconUrl());
            event.getChannel().sendMessage(futuresBot.build()).queue();

        }

    };

    if (scheduledFuture == null)
        scheduledFuture = exec.scheduleAtFixedRate(futRun, 0, 1, TimeUnit.HOURS);


}
if (args[0].equalsIgnoreCase("!futuresoff")) {
    event.getChannel().sendMessage("Futures bot off.").queue();
    if (scheduledFuture != null) {
        scheduledFuture.cancel(true);
        scheduledFuture = null;
    }
}
    ```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...