Size: a a a

2016 November 16

П

Павел in Java Developers
есть задача останавливать потоки, прерывать выполнения долгой задачи. их может быть много, например 10 потоков которые выполняются по 1-99999 минут.  нужно реализовать функционал остановки этих процессов
источник

П

Павел in Java Developers
есть шедулер который запускает N задач. в отдельных потоках. И нужно уметь с веб морды кнопкой стоп остановить нужный
источник

SU

Sergey Ushakov in Java Developers
Если выполняемые задачи "собственные", то лучше предусмотреть какой-нибудь флаг, который они проверяют и останавливаются если его взвели
источник

П

Павел in Java Developers
их может быть много и они одно типные
источник

П

Павел in Java Developers
сейчас подробно напишу мин 5 писать буду)
источник

SU

Sergey Ushakov in Java Developers
если исполняемые таски не под контролем и выполняться могут очень долго, то остается только java.lang.Thread#interrupt и java.lang.Thread#stop()
источник

П

Павел in Java Developers
Есть веб морда со списком имен(названия отчетов). например
1 сидоров старт
2 петров старт
3 иванов старт
4 пупкин старт
...
n  хзхз старт

пользователь может натыкать стартов хоть все. в этот момент запись меняет статус на готова в базе и все. А каждые  n  секунд шедулер дергает нужные записи с нужным статусом и запускает генерацию отчета в отдельном потоке. генерация одна для всех только данные разные. А на веб морде просто обновляется табличка  ajax ом и в зависимости от статусов показывает отчет в каком состоянии. когда поток завершит выполнения генерации то ставит записи статус готово. все просто. Но нужно уметь останавливать эти генерации не дожидаясь выполнения.  Тоесть на веб морде после старта кнопка меняется на стоп и при нажатии надо прервать поток. Я это делал когда у меня было всего 3 процесса.

private FutureTask<Boolean> futureTask1;
   private FutureTask<Boolean> futureTask2;
   private FutureTask<Boolean> futureTask3;

for (MyTask task : allActiveTasks) {
           FutureTask<Boolean> futureTask = new FutureTask<😡) -> {
               try {
                   generate(task);
               } catch (IOException | NurException | JRException e) {
                   logger.error("ERROR " + e.getMessage());
               }
               return true;
           });
           if (task.getType().equals("...")) {
               futureTask1 = futureTask;
           }
           if (task.getType().equals("...")) {
               futureTask2 = futureTask;
           }
           if (task.getType().equals("...")) {
               futureTask3 = futureTask;
           }
           threadPool.submit(futureTask);

а потом чтобы остановить

public boolean stopThread(String name) {
       if (name.equals("...")) {
           if (futureTask1 == null) return false;
           futureTask1.cancel(true);
           return futureTask1.isCancelled();
       }
       if (name.equals("...")) {
           if (futureTask2 == null) return false;
           futureTask2.cancel(true);
           return futureTask2.isCancelled();
       }
       if (name.equals("...")) {
           if (futureTask3 == null) return false;
           futureTask3.cancel(true);
           return futureTask3.isCancelled();
       }
       return false;
   }
источник

П

Павел in Java Developers
но сейчас их не три а много. я думал создать map в  который добавлять FutureTask и как кей название а потом находить в нем по ключу нужный и стопить. но хз норм ли это, или может кто знает как это сделать проще/правильней
источник

SU

Sergey Ushakov in Java Developers
положить в мапу да и забыть
источник

SU

Sergey Ushakov in Java Developers
в смысле не забыть потом из неё убрать
источник

П

Павел in Java Developers
спасибо, а то чтото засомневался)
источник

MK

M K in Java Developers
а сервак один? а что если масштабировать будем?
источник

MK

M K in Java Developers
``А на веб морде просто обновляется табличка  ajax ом и в зависимости от статусов показывает отчет в каком состоянии.`` а не проще лонг полингом или сокетами сделать?
источник

П

Павел in Java Developers
сервер один и маштабироваться точно не будет
источник

П

Павел in Java Developers
лонг полингом - надо почитать, а сокетами точно не вариант
источник

MK

M K in Java Developers
почему сокетами не вариант?
источник

П

Павел in Java Developers
потому что морда может закрыться и соединение потеряется, потом его востанавливать надо
источник

П

Павел in Java Developers
и постоянно держать соединение
источник

RM

Ruslan Molchanov in Java Developers
Что значит "восстанавливать"? Поддерживать соединение дешевле, чем то, что ты делаешь сейчас. Опрос по таймеру - самое топорное и неуклюжое решение в данном случае.
источник

MK

M K in Java Developers
а если представить, что есть 100 клиентов, которые долбят сервак. а при каждом запросе на сервак надо же авторизовывать клиента.
источник