Я использую асинхронные сервлеты для длительного процесса и реализовал длительный опрос на стороне клиента, чтобы он мог отображать ход выполнения и уведомлять клиента о завершении. У меня есть сервлет-уведомитель, который вручную сортирует, какие клиенты получают какое сообщение, вручную вставляя идентификатор сеанса через пользовательский класс 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);