#java #optimization #architecture #scheduled-tasks #java-6
#java #оптимизация #архитектура #запланированные задачи #java-6
Вопрос:
На нашем сервере мы предоставили одну функцию для отправки запроса на другой сервер в определенное время.
Сценарий выглядит следующим образом:
-
Server1 отправляет запрос на Session1 на наш сервер
-
Запрос содержит время, в которое мы должны отправить запрос на Server1 с тем же идентификатором сеанса
Мы добились этого, запланировав запрос на определенное время.
Пример.
Запрос Session1 получен от Server1 в 10:00 утра, а заданное время — 11:00 вечера, поэтому мы запланировали этот запрос на 11:00 вечера.
Единственная проблема в том, что сеанс может быть завершен раньше времени, и мы должны отменить запланированную задачу для этого сеанса.
Соотношение сеансов, истекших до заданного времени, составляет 10: 8, т.е. 8 из 10 будут завершены раньше времени.
Java ScheduleThreadPool
будет помечать задачу для отмены только при вызове cancel on task, но не удаляет задачу.
Я не могу вызвать Queue.purge()
метод для удаления отмененной задачи, потому что номер отмененной задачи может быть в lac, например, 2 lac
другое решение,
Я могу управлять Map of <Session-ID, Time>
, и на почасовой основе я буду проверять количество идентификаторов сеанса, которые необходимо будет аутентифицировать в течение следующего часа, и запланировать только этот идентификатор сеанса. Это уменьшит некоторые накладные расходы, потому что я удалю идентификатор сеанса из map, если он будет завершен раньше времени.
пожалуйста, предложите любой другой способ лучше, чем эти, или любые изменения в существующих для оптимизации вышеупомянутого решения
Ответ №1:
Если использование ScheduledThreadPoolExecutor вам подходит: в API есть опция, которая позволяет удалять отмененные задачи по умолчанию: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html#setRemoveOnCancelPolicy(boolean)
Комментарии:
1. джон, спасибо за ответ. Эта функция есть в JDK7, в настоящее время мы используем jdk6. Но спасибо за обновление, я не знаю об этих функциях.
2. Хорошо, я понимаю. Что вы подразумеваете под «я не могу вызвать метод Queue.purge() для удаления отмененной задачи, потому что номер отмененной задачи может быть в lac, например, 2 lac»? Является ли использование очистки для исполнителя пула потоков опцией?
3. Это может быть худшим вариантом удаления задач в моем случае, поскольку размер очереди чрезвычайно велик, и перебирать каждого участника для проверки отмены — неправильный способ. Это телекоммуникационное приложение, поэтому вы можете понять, сколько трафика оно обрабатывает.
4. Привет, Джон, я создаю свой собственный исполнитель пула потоков, который расширяет ScheduledThreadPoolExecutor и предоставляет дополнительные методы, которые предусмотрены в JDK 7. Я думаю, что этот вариант подходит, так как всякий раз, когда мы переводим наш сервер на JDK 7, этот класс устареет и будет использовать JDK7 Schedule ThereadPoll. Спасибо за предложение