Задать вопрос

Как выполнить действие после задержки в netty-socketio?

Всем привет.


Пишу сервис на Java используя вот эту чудесную библиотеку.
github.com/mrniko/netty-socketio


Столкнулся со следующей задачей. К сервису подключаются пользователи и для каждого из них, мне надо отсчитать тридцать секунд, а затем выполнить некоторое действие.

Честно говоря не совсем представляю себе как подступиться к этой задаче.

Таймер java вроде бы выполняется отдельным потоком, но как связать этот таймер с событийной моделью данной библиотеки — у меня не хватает опыта. Как я понимаю, в данной библиотеке, входящие данные обрабатываются отдельным потоком и передаются в функции — слушатели, которые так-же крутятся в отдельных потоках. Я вижу решение, в том, чтобы имитировать поступление данных из потока таймера и передавать событие на обработку, каждую секунду. Но шестое чувство подсказывает мне, что должен быть способ проще и также многопоточный.


Собственно вопрос, как в java обычно решают такие задачи? Какие варианты решить эту задачу с помощью этой библиотеки?

Спасибо.
  • Вопрос задан
  • 3103 просмотра
Подписаться 3 Оценить Комментировать
Решения вопроса 2
Делается в Java подобное посредством ScheduledExecutorService.
В библиотеке это реализовано так и так
Вообще советую разобраться с содержимым пакета java.util.concurrent.

Собственно советую глянуть Atmosphere - отлично интегрируется в Play2 / Grails, и поддержка в целом получше. С Socket.io там проблем нет.
Ответ написан
Комментировать
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Можно так
import io.netty.util.Timer;
import io.netty.util.TimerTask;

timer.newTimeout(new TimerTask() {
    @Override
    public void run(Timeout timeout) throws Exception {
        // Отложенное действие
    }
}, 30, TimeUnit.SECONDS);

но лучше так
eventLoop.schedule(() -> {
    // Отложенное действие
}, 30, TimeUnit.MILLISECONDS);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Да код таймера выполняется отдельным потоком, скорее всего нужно создать новый класс таймера, в конструкторе которого передавать SocketIOClient client и сохранять в свойстве таймера, тогда из события таймера можно будет отсылать сообщения в client, если он еще не отключился. Только вот нужно узнать, класс SocketIOClient потоко-безопастный или нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы