From 96eba5f89a4d8b670cd5bcac77f6580f9bfed9ff Mon Sep 17 00:00:00 2001 From: hengsin Date: Wed, 22 Jan 2020 11:48:46 +0800 Subject: [PATCH] IDEMPIERE-4154 ServerPush Adjustments --- .../zk/atmosphere/AtmosphereServerPush.java | 54 ++++++++++++++++--- .../org/adempiere/webui/AdempiereWebUI.java | 5 +- org.adempiere.ui.zk/WEB-INF/zk.xml | 10 ++-- 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/fi/jawsy/jawwa/zk/atmosphere/AtmosphereServerPush.java b/org.adempiere.ui.zk/WEB-INF/src/fi/jawsy/jawwa/zk/atmosphere/AtmosphereServerPush.java index 6c518c079e..c42122f0a6 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/fi/jawsy/jawwa/zk/atmosphere/AtmosphereServerPush.java +++ b/org.adempiere.ui.zk/WEB-INF/src/fi/jawsy/jawwa/zk/atmosphere/AtmosphereServerPush.java @@ -20,6 +20,8 @@ the License. package fi.jawsy.jawwa.zk.atmosphere; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.atomic.AtomicReference; import org.atmosphere.cpr.AtmosphereResource; @@ -58,6 +60,7 @@ public class AtmosphereServerPush implements ServerPush { private ThreadInfo _active; private ExecutionCarryOver _carryOver; private final Object _mutex = new Object(); + private List> schedules = new ArrayList<>(); public AtmosphereServerPush() { String timeoutString = Library.getProperty("fi.jawsy.jawwa.zk.atmosphere.timeout"); @@ -155,19 +158,42 @@ public class AtmosphereServerPush implements ServerPush { return _active != null && _active.nActive > 0; } - @Override + @SuppressWarnings("unchecked") + @Override public void onPiggyback() { + Schedule[] pendings = null; + synchronized (schedules) { + if (!schedules.isEmpty()) { + pendings = schedules.toArray(new Schedule[0]); + schedules = new ArrayList<>(); + } + } + if (pendings != null && pendings.length > 0) { + for(Schedule p : pendings) { + p.scheduler.schedule(p.task, p.event); + } + } } - @Override + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override public void schedule(EventListener task, T event, Scheduler scheduler) { - scheduler.schedule(task, event); - try { - commitResponse(); - } catch (IOException e) { - log.error(e.getLocalizedMessage(), e); - } + if (Executions.getCurrent() == null) { + //save for schedule at on piggyback event + synchronized (schedules) { + schedules.add(new Schedule(task, event, scheduler)); + } + try { + commitResponse(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } else { + //in event listener thread, can schedule immediately + scheduler.schedule(task, event); + } + } @Override @@ -238,4 +264,16 @@ public class AtmosphereServerPush implements ServerPush { @Override public void resume() { } + + private class Schedule { + private EventListener task; + private T event; + private Scheduler scheduler; + + private Schedule(EventListener task, T event, Scheduler scheduler) { + this.task = task; + this.event = event; + this.scheduler = scheduler; + } + } } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java index 1ebfa468ac..a8741802ff 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java @@ -523,9 +523,12 @@ public class AdempiereWebUI extends Window implements EventListener, IWeb Env.setContext(properties, Env.LANGUAGE, Env.getContext(Env.getCtx(), Env.LANGUAGE)); Env.setContext(properties, AEnv.LOCALE, Env.getContext(Env.getCtx(), AEnv.LOCALE)); - Locale locale = (Locale) Executions.getCurrent().getDesktop().getSession().getAttribute(Attributes.PREFERRED_LOCALE); + Desktop desktop = Executions.getCurrent().getDesktop(); + Locale locale = (Locale) desktop.getSession().getAttribute(Attributes.PREFERRED_LOCALE); HttpServletRequest httpRequest = (HttpServletRequest) Executions.getCurrent().getNativeRequest(); + if (desktop.isServerPushEnabled()) + desktop.enableServerPush(false); Session session = logout0(); //clear context and invalidate session diff --git a/org.adempiere.ui.zk/WEB-INF/zk.xml b/org.adempiere.ui.zk/WEB-INF/zk.xml index f10b359f2e..e0a81b5e60 100644 --- a/org.adempiere.ui.zk/WEB-INF/zk.xml +++ b/org.adempiere.ui.zk/WEB-INF/zk.xml @@ -57,14 +57,14 @@ polling - org.zkoss.zkex.ui.impl.PollingServerPush comet - org.zkoss.zkmax.ui.comet.CometServerPush ( enterprise edition only ) --> - ajax - org.idempiere.ui.zk.websocket.WebSocketServerPush + fi.jawsy.jawwa.zk.atmosphere.AtmosphereServerPush +