1003398 IDEMPIERE-1469 idempiere monitor page don't display processes on starting

This commit is contained in:
Heng Sin Low 2013-10-28 20:45:14 +08:00
parent 78eb8c02da
commit 07c83ff7fd
4 changed files with 147 additions and 38 deletions

View File

@ -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

View File

@ -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;
}
}

View File

@ -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<AdempiereServer, AdempiereProcessor>, IServerFactory<AdempiereServer, AdempiereProcessor>>, BundleListener
{
private static ServiceTracker<IServerFactory<AdempiereServer, AdempiereProcessor>, IServerFactory<AdempiereServer, AdempiereProcessor>> 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<AdempiereServer, AdempiereProcessor>, IServerFactory<AdempiereServer, AdempiereProcessor>>(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<ServerWrapper>();
processorClass = new HashSet<String>();
} // 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<String> 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<ServerWrapper>();
processorClass = new HashSet<String>();
//osgi server
List<IServerFactory> serverFactoryList = Service.locator().list(IServerFactory.class).getServices();
if (serverFactoryList != null && !serverFactoryList.isEmpty())
{
List<String> processed = new ArrayList<String>();
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<AdempiereServer, AdempiereProcessor> 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<ServerWrapper> list = new ArrayList<ServerWrapper>();
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<ServerWrapper> list = new ArrayList<ServerWrapper>();
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<AdempiereServer, AdempiereProcessor> addingService(
ServiceReference<IServerFactory<AdempiereServer, AdempiereProcessor>> reference) {
IServerFactory<AdempiereServer, AdempiereProcessor> factory = AdempiereServerActivator.getBundleContext().getService(reference);
createServers(factory);
startAll();
return factory;
}
@Override
public void modifiedService(
ServiceReference<IServerFactory<AdempiereServer, AdempiereProcessor>> reference,
IServerFactory<AdempiereServer, AdempiereProcessor> service) {
}
@Override
public void removedService(
ServiceReference<IServerFactory<AdempiereServer, AdempiereProcessor>> reference,
IServerFactory<AdempiereServer, AdempiereProcessor> 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

View File

@ -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 {