From 07c83ff7fde19188d4cee42362e28b1c93bb7ac3 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Mon, 28 Oct 2013 20:45:14 +0800 Subject: [PATCH] 1003398 IDEMPIERE-1469 idempiere monitor page don't display processes on starting --- org.adempiere.server/META-INF/MANIFEST.MF | 3 + .../server/AdempiereServerActivator.java | 54 ++++++++ .../compiere/server/AdempiereServerMgr.java | 125 +++++++++++++----- .../org/compiere/web/AdempiereMonitor.java | 3 +- 4 files changed, 147 insertions(+), 38 deletions(-) create mode 100644 org.adempiere.server/src/main/server/org/adempiere/server/AdempiereServerActivator.java diff --git a/org.adempiere.server/META-INF/MANIFEST.MF b/org.adempiere.server/META-INF/MANIFEST.MF index fb1bb1f0cc..e2c9fac0f2 100644 --- a/org.adempiere.server/META-INF/MANIFEST.MF +++ b/org.adempiere.server/META-INF/MANIFEST.MF @@ -22,6 +22,8 @@ Import-Package: javax.jms;version="1.1.0", org.apache.ecs, org.apache.ecs.xhtml, org.apache.poi.hssf.usermodel, + org.osgi.framework;version="1.6.0", + org.osgi.util.tracker;version="1.5.0", org.restlet, org.restlet.data, org.restlet.ext.servlet, @@ -37,3 +39,4 @@ Export-Package: org.adempiere.server, org.idempiere.server.factory Bundle-ActivationPolicy: lazy Service-Component: OSGI-INF/acctprocessorfactory.xml, OSGI-INF/alertprocessorfactory.xml, OSGI-INF/ldapprocessorfactory.xml, OSGI-INF/requestprocessorfactory.xml, OSGI-INF/schedulerfactory.xml, OSGI-INF/workflowprocessorfactory.xml +Bundle-Activator: org.adempiere.server.AdempiereServerActivator diff --git a/org.adempiere.server/src/main/server/org/adempiere/server/AdempiereServerActivator.java b/org.adempiere.server/src/main/server/org/adempiere/server/AdempiereServerActivator.java new file mode 100644 index 0000000000..7ddd6c5527 --- /dev/null +++ b/org.adempiere.server/src/main/server/org/adempiere/server/AdempiereServerActivator.java @@ -0,0 +1,54 @@ +/****************************************************************************** + * Copyright (C) 2013 Trek Global * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ +package org.adempiere.server; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +/** + * @author hengsin + * + */ +public class AdempiereServerActivator implements BundleActivator { + + private static BundleContext context = null; + + /** + * default constructor + */ + public AdempiereServerActivator() { + } + + /* (non-Javadoc) + * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) + */ + @Override + public void start(BundleContext context) throws Exception { + AdempiereServerActivator.context = context; + } + + /* (non-Javadoc) + * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) + */ + @Override + public void stop(BundleContext context) throws Exception { + AdempiereServerActivator.context = null; + } + + /** + * @return BundleContext + */ + public static BundleContext getBundleContext() { + return context; + } +} diff --git a/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerMgr.java b/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerMgr.java index 4b057eeaff..ffe640a51f 100644 --- a/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerMgr.java +++ b/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerMgr.java @@ -18,19 +18,27 @@ package org.compiere.server; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Properties; +import java.util.Set; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import org.adempiere.base.Service; +import org.adempiere.server.AdempiereServerActivator; import org.adempiere.server.IServerFactory; import org.compiere.Adempiere; import org.compiere.model.AdempiereProcessor; import org.compiere.model.MSession; import org.compiere.util.CLogger; import org.compiere.util.Env; +import org.osgi.framework.BundleEvent; +import org.osgi.framework.BundleListener; +import org.osgi.framework.ServiceReference; +import org.osgi.util.tracker.ServiceTracker; +import org.osgi.util.tracker.ServiceTrackerCustomizer; /** * Adempiere Server Manager @@ -38,8 +46,10 @@ import org.compiere.util.Env; * @author Jorg Janke * @version $Id: AdempiereServerMgr.java,v 1.4 2006/10/09 00:23:26 jjanke Exp $ */ -public class AdempiereServerMgr +public class AdempiereServerMgr implements ServiceTrackerCustomizer, IServerFactory>, BundleListener { + private static ServiceTracker, IServerFactory> serviceTracker; + /** * Get Adempiere Server Manager * @return mgr @@ -48,10 +58,11 @@ public class AdempiereServerMgr { if (m_serverMgr == null) { - // for faster subsequent calls m_serverMgr = new AdempiereServerMgr(); - m_serverMgr.startServers(); - m_serverMgr.log.info(m_serverMgr.toString()); + serviceTracker = new ServiceTracker, IServerFactory>(AdempiereServerActivator.getBundleContext(), + IServerFactory.class.getName(), m_serverMgr); + serviceTracker.open(); + AdempiereServerActivator.getBundleContext().addBundleListener(m_serverMgr); } return m_serverMgr; } // get @@ -68,7 +79,8 @@ public class AdempiereServerMgr { super(); startEnvironment(); - // m_serverMgr.startServers(); + m_servers=new ArrayList(); + processorClass = new HashSet(); } // AdempiereServerMgr /** The Servers */ @@ -77,6 +89,8 @@ public class AdempiereServerMgr private Properties m_ctx = Env.getCtx(); /** Start */ private Timestamp m_start = new Timestamp(System.currentTimeMillis()); + + private Set processorClass; /** * Start Environment @@ -100,36 +114,24 @@ public class AdempiereServerMgr * Start Environment * @return true if started */ - @SuppressWarnings("rawtypes") - public boolean startServers() + @SuppressWarnings({ "rawtypes", "unchecked" }) + public synchronized boolean reload() { log.info(""); - int noServers = 0; + if (!stopAll()) + return false; + + int noServers = 0; m_servers=new ArrayList(); + processorClass = new HashSet(); //osgi server List serverFactoryList = Service.locator().list(IServerFactory.class).getServices(); if (serverFactoryList != null && !serverFactoryList.isEmpty()) { - List processed = new ArrayList(); for(IServerFactory factory : serverFactoryList ) { - String name = factory.getProcessorClass().getName(); - if (!processed.contains(name)) - { - processed.add(name); - AdempiereServer[] servers = factory.create(m_ctx); - if (servers != null && servers.length > 0) - { - for (AdempiereServer server : servers) - { - AdempiereProcessor model = server.getModel(); - if (AdempiereServer.isOKtoRunOnIP(model)) { - m_servers.add(new ServerWrapper(server)); - } - } - } - } + createServers(factory); } } @@ -137,6 +139,25 @@ public class AdempiereServerMgr return startAll(); } // startEnvironment + private void createServers(IServerFactory factory) { + String name = factory.getProcessorClass().getName(); + if (!processorClass.contains(name)) + { + processorClass.add(name); + AdempiereServer[] servers = factory.create(m_ctx); + if (servers != null && servers.length > 0) + { + for (AdempiereServer server : servers) + { + AdempiereProcessor model = server.getModel(); + if (AdempiereServer.isOKtoRunOnIP(model)) { + m_servers.add(new ServerWrapper(server)); + } + } + } + } + } + /** * Get Server Context * @return ctx @@ -150,7 +171,7 @@ public class AdempiereServerMgr * Start all servers * @return true if started */ - public boolean startAll() + public synchronized boolean startAll() { log.info (""); ServerWrapper[] servers = getInActive(); @@ -159,7 +180,7 @@ public class AdempiereServerMgr ServerWrapper server = servers[i]; try { - if (server.scheduleFuture != null || !server.scheduleFuture.isDone()) + if (server.scheduleFuture != null && !server.scheduleFuture.isDone()) continue; // Do start // replace @@ -205,7 +226,7 @@ public class AdempiereServerMgr * @param serverID server ID * @return true if started */ - public boolean start (String serverID) + public synchronized boolean start (String serverID) { ServerWrapper server = getServer(serverID); if (server == null) @@ -231,7 +252,7 @@ public class AdempiereServerMgr * Stop all Servers * @return true if stopped */ - public boolean stopAll() + public synchronized boolean stopAll() { log.info (""); ServerWrapper[] servers = getActive(); @@ -311,7 +332,7 @@ public class AdempiereServerMgr * @param serverID server ID * @return true if interrupted */ - public boolean stop (String serverID) + public synchronized boolean stop (String serverID) { ServerWrapper server = getServer(serverID); if (server == null) @@ -337,7 +358,7 @@ public class AdempiereServerMgr /** * Destroy */ - public void destroy () + public synchronized void destroy () { log.info (""); stopAll(); @@ -348,7 +369,7 @@ public class AdempiereServerMgr * Get Active Servers * @return array of active servers */ - protected ServerWrapper[] getActive() + protected synchronized ServerWrapper[] getActive() { ArrayList list = new ArrayList(); for (int i = 0; i < m_servers.size(); i++) @@ -366,7 +387,7 @@ public class AdempiereServerMgr * Get InActive Servers * @return array of inactive servers */ - protected ServerWrapper[] getInActive() + protected synchronized ServerWrapper[] getInActive() { ArrayList list = new ArrayList(); for (int i = 0; i < m_servers.size(); i++) @@ -384,7 +405,7 @@ public class AdempiereServerMgr * Get all Servers * @return array of servers */ - public ServerWrapper[] getAll() + public synchronized ServerWrapper[] getAll() { ServerWrapper[] retValue = new ServerWrapper[m_servers.size()]; m_servers.toArray (retValue); @@ -396,7 +417,7 @@ public class AdempiereServerMgr * @param serverID server id * @return server or null */ - public ServerWrapper getServer (String serverID) + public synchronized ServerWrapper getServer (String serverID) { if (serverID == null) return null; @@ -436,7 +457,7 @@ public class AdempiereServerMgr * Get Number Servers * @return no of servers */ - public String getServerCount() + public synchronized String getServerCount() { int noRunning = 0; int noStopped = 0; @@ -497,4 +518,36 @@ public class AdempiereServerMgr } } + + @Override + public synchronized IServerFactory addingService( + ServiceReference> reference) { + IServerFactory factory = AdempiereServerActivator.getBundleContext().getService(reference); + createServers(factory); + startAll(); + return factory; + } + + @Override + public void modifiedService( + ServiceReference> reference, + IServerFactory service) { + } + + @Override + public void removedService( + ServiceReference> reference, + IServerFactory service) { + } + + @Override + public void bundleChanged(BundleEvent event) { + if (event.getType() == BundleEvent.STOPPED) { + if (serviceTracker != null) + serviceTracker.close(); + } else if (event.getType() == BundleEvent.STARTED) { + if (serviceTracker != null) + serviceTracker.open(); + } + } } // AdempiereServerMgr diff --git a/org.adempiere.server/src/main/servlet/org/compiere/web/AdempiereMonitor.java b/org.adempiere.server/src/main/servlet/org/compiere/web/AdempiereMonitor.java index 0ed5420639..9183ceb616 100644 --- a/org.adempiere.server/src/main/servlet/org/compiere/web/AdempiereMonitor.java +++ b/org.adempiere.server/src/main/servlet/org/compiere/web/AdempiereMonitor.java @@ -300,8 +300,7 @@ public class AdempiereMonitor extends HttpServlet { if (reload) { - m_serverMgr.stopAll(); - ok=m_serverMgr.startServers(); + ok=m_serverMgr.reload(); this.createSummaryPage(request, response,true); m_dirAccessList = getDirAcessList(); } else {