Хобрук: Ваш путь к мастерству в программировании

Java EE AsyncContext для каждого клиента

Я использую асинхронные сервлеты для длительного процесса и реализовал длительный опрос на стороне клиента, чтобы он мог отображать ход выполнения и уведомлять клиента о завершении. У меня есть сервлет-уведомитель, который вручную сортирует, какие клиенты получают какое сообщение, вручную вставляя идентификатор сеанса через пользовательский класс EventNotify. Если getEventId() не совпадает с eventid, мы отправляем клиенту «IGNORE», и клиент вручную игнорирует сообщение. notifyPeers автоматически рассылает уведомление ВСЕМ клиентам. Если выполняется много длительных заданий, это может стать очень шумным. Есть ли способ, чтобы notifyPeers отправлял уведомление только клиенту, с которым зарегистрирован AsyncContext? Заранее спасибо!

@Singleton
public class Notifier {
    private final Queue<AsyncContext> peers = new ConcurrentLinkedQueue();
    private final HashMap<AsyncContext, String> acsessionmap = new HashMap<AsyncContext, String>();

    public void notifyPeers(@Observes EventNotify evn) {
        for (AsyncContext ac : peers) {
            try {
                String aceventid = acsessionmap.get(ac);
                final ServletOutputStream os = ac.getResponse().getOutputStream();
                if (Util.equals(aceventid, evn.getSessd())) {
                    os.println(evn.getSessid() + ": " + evn.getMessage());
                } else {
                    os.println("IGNORE");
                }
                ac.complete();
            } catch (IOException ex) {
            } finally {
                peers.remove(ac);
            }
        }
    }

public void addAsyncContext(final AsyncContext ac, String sessid) 
    ...
    acsessionmap.put(ac,sessid);
    peers.add(ac);

  • Websocket, вероятно, может быть лучшим выбором здесь? 16.01.2017

Ответы:


1

Вот решение. Избавление от @Singleton не работает, потому что AsyncContexts вообще перестали «подключаться».
Что действительно работает, так это сохранение синглтона и избавление от одноранговых узлов Queue. Вместо этого поддерживайте хэш-карту:

private final HashMap<String, AsyncContext> sessionacmap = new HashMap<String, AsyncContext>();

sessionacmap.put(sessid, ac);

вместо цикла сверстников:

    for (AsyncContext ac : peers) {

Потяните только асинхронный контекст и действуйте в соответствии с ним:

    AsyncContext ac = sessionacmap.get(evn.getEventid());
    if (ac==null) return;
    try {
        final ServletOutputStream os = ac.getResponse().getOutputStream();
    ....

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

01.02.2017
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..