Уведомления о событиях пользователей, хранящихся в качестве временной метки в БДJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Уведомления о событиях пользователей, хранящихся в качестве временной метки в БД

Сообщение Anonymous »

Пользователи могут запланировать временные метки событий, при которых они должны быть уведомлены:
События

Код: Выделить всё

id | name | epochms
< /code>
Прямо сейчас у меня есть контроллер для создания события, и сразу после его создания он планирует его так: < /p>
@PostMapping("new_event")
public void newEvent(@RequestBody EventDto eventDto) {
service.createEvent(eventDto);
}
< /code>
public void createEvent(EventDto eventDto) {
Event event = converter.convert(eventDto);
event = repository.save(event);
scheduler.schedule(event);
}
< /code>
protected final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(50);

public void schedule(Event event) {
long delay = event.getTimestamp() / 1_000L - Instant.now().getEpochSecond();
scheduler.schedule(() -> notify(event), delay, TimeUnit.SECONDS);
}

@Transactional
public void notify(Event event) {
// notify the user, save changes in db
}
< /code>
Currently it works well, but only with a handful of users. I realize that it's not very efficient and if there are more users I wouldn't be able to create a separate thread per user event.
I'm trying to figure out what are the better approaches that are usually used in cases like this.
One approach I see is to use virtual threads: thousands of them could be created, and a custom scheduler could be used, like in the linked article:
static Future schedule(Runnable task, int delay, TemporalUnit unit, ExecutorService executorService) {
return executorService.submit(() -> {
try {
Thread.sleep(Duration.of(delay, unit));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}

task.run();
});
}
< /code>
I'm not sure it's the correct approach, though. Another one I've been thinking about is having a PriorityQueue
ожидающих событий, например, все события в следующем часе и имеют один запрос потока, который встает в очередь каждую секунду, чтобы увидеть, есть ли там какие -либо новые события. Я не уверен, насколько хорошо это масштабируется.>

Подробнее здесь: https://stackoverflow.com/questions/795 ... tamp-in-db
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»