Альтернатива запланированной задаче, которая может быть отменена в будущем

#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. Спасибо за предложение