From 63799a559f90483285001a6807ea2f1df120bf37 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 2 Oct 2008 14:01:08 +0000 Subject: [PATCH] Restrcuture the location of the execution server git-svn-id: https://svn.argeo.org/slc/trunk@1684 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- org.argeo.slc.detached/pom.xml | 1 + .../org/argeo/slc/detached/Activator.java | 28 ++++++++++ .../detached/DetachedExecutionServerImpl.java | 56 +++++++++---------- .../slc/detached/SimpleDetachedActivator.java | 27 +++++++-- .../argeo/slc/detached/admin/OpenSession.java | 35 +++++++++++- .../slc/detached/drivers/AbstractDriver.java | 56 +++++++++++++++++++ .../slc/detached/drivers/FileDriver.java | 55 +++++++++--------- .../src/main/resources/META-INF/MANIFEST.MF | 20 ++++--- .../META-INF/spring/slc-detached.xml | 12 ++++ 9 files changed, 221 insertions(+), 69 deletions(-) create mode 100644 org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/Activator.java create mode 100644 org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/drivers/AbstractDriver.java create mode 100644 org.argeo.slc.detached/src/main/resources/META-INF/spring/slc-detached.xml diff --git a/org.argeo.slc.detached/pom.xml b/org.argeo.slc.detached/pom.xml index 79cb5b4c9..22dd847ef 100644 --- a/org.argeo.slc.detached/pom.xml +++ b/org.argeo.slc.detached/pom.xml @@ -26,6 +26,7 @@ ${pom.artifactId} + org.argeo.slc.detached.Activator org.argeo.slc.detached.* diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/Activator.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/Activator.java new file mode 100644 index 000000000..b9ef442d2 --- /dev/null +++ b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/Activator.java @@ -0,0 +1,28 @@ +package org.argeo.slc.detached; + +import java.util.Properties; + +import org.osgi.framework.BundleContext; + +public class Activator extends AbstractDetachedActivator { + private DetachedExecutionServerImpl executionServer; + + protected void startAutoBundle(BundleContext context) throws Exception { + Object obj = getStaticRefProvider().getStaticRef("executionServer"); + if (obj != null) + executionServer = (DetachedExecutionServerImpl) obj; + else + throw new DetachedException("Could not find execution server."); + + executionServer.init(context); + + context.registerService(DetachedExecutionServer.class.getName(), + executionServer, new Properties()); + } + + protected void stopAutoBundle(BundleContext context) throws Exception { + // TODO Auto-generated method stub + super.stopAutoBundle(context); + } + +} diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedExecutionServerImpl.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedExecutionServerImpl.java index a11c37049..5d168675c 100644 --- a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedExecutionServerImpl.java +++ b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedExecutionServerImpl.java @@ -20,20 +20,20 @@ public class DetachedExecutionServerImpl implements DetachedExecutionServer { private int skipCount = 0; private BundleContext bundleContext; - private DetachedDriver driver; + //private DetachedDriver driver; - private boolean active = false; + //private boolean active = false; - public void setDriver(DetachedDriver driver) { - this.driver = driver; - } +// public void setDriver(DetachedDriver driver) { +// this.driver = driver; +// } public DetachedExecutionServerImpl() { detachedContext = new DetachedContextImpl(); sessions = new Vector(); } - public DetachedAnswer executeStep(DetachedRequest request) { + public synchronized DetachedAnswer executeStep(DetachedRequest request) { DetachedAnswer answer = null; try { DetachedStep step = null; @@ -171,28 +171,28 @@ public class DetachedExecutionServerImpl implements DetachedExecutionServer { public void init(BundleContext bundleContext) { this.bundleContext = bundleContext; - Thread driverThread = new Thread(new Runnable() { - - public void run() { - while (active) { - try { - DetachedRequest request = driver.receiveRequest(); - DetachedAnswer answer = executeStep(request); - driver.sendAnswer(answer); - } catch (Exception e) { - if (e instanceof RuntimeException) - throw (RuntimeException) e; - else - e.printStackTrace(); - } - } - - } - }, "driverThread"); - - active = true; - - driverThread.start(); +// Thread driverThread = new Thread(new Runnable() { +// +// public void run() { +// while (active) { +// try { +// DetachedRequest request = driver.receiveRequest(); +// DetachedAnswer answer = executeStep(request); +// driver.sendAnswer(answer); +// } catch (Exception e) { +// if (e instanceof RuntimeException) +// throw (RuntimeException) e; +// else +// e.printStackTrace(); +// } +// } +// +// } +// }, "driverThread"); +// +// active = true; +// +// driverThread.start(); } } diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/SimpleDetachedActivator.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/SimpleDetachedActivator.java index 5006eec83..8df5bbc4a 100644 --- a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/SimpleDetachedActivator.java +++ b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/SimpleDetachedActivator.java @@ -2,22 +2,37 @@ package org.argeo.slc.detached; import java.util.Properties; +import org.argeo.slc.detached.drivers.AbstractDriver; import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; public class SimpleDetachedActivator extends AbstractDetachedActivator { - private DetachedExecutionServerImpl executionServer; + private AbstractDriver driver; protected void startAutoBundle(BundleContext context) throws Exception { - Object obj = getStaticRefProvider().getStaticRef("executionServer"); + Object obj = getStaticRefProvider().getStaticRef("slcDetached.driver"); if (obj != null) - executionServer = (DetachedExecutionServerImpl) obj; + driver = (AbstractDriver) obj; + else + throw new DetachedException("Could not find driver."); + + DetachedExecutionServer executionServer = null; + ServiceReference ref = context + .getServiceReference(DetachedExecutionServer.class.getName()); + if (ref != null) + executionServer = (DetachedExecutionServer) context.getService(ref); else throw new DetachedException("Could not find execution server."); + driver.setExecutionServer(executionServer); + driver.start(); - executionServer.init(context); + context.registerService(DetachedDriver.class.getName(), driver, + new Properties()); + } - context.registerService(DetachedExecutionServer.class.getName(), - executionServer, new Properties()); + protected void stopAutoBundle(BundleContext context) throws Exception { + if (driver != null) + driver.stop(); } } diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/admin/OpenSession.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/admin/OpenSession.java index 2bf37b2f9..11966a975 100644 --- a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/admin/OpenSession.java +++ b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/admin/OpenSession.java @@ -2,12 +2,18 @@ package org.argeo.slc.detached.admin; import java.util.Properties; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.argeo.slc.detached.DetachedAdminCommand; +import org.argeo.slc.detached.DetachedException; import org.argeo.slc.detached.DetachedRequest; import org.argeo.slc.detached.DetachedSession; +import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; +import org.osgi.framework.BundleException; public class OpenSession implements DetachedAdminCommand { + private final static Log log = LogFactory.getLog(OpenSession.class); public DetachedSession execute(DetachedRequest request, BundleContext bundleContext) { @@ -18,7 +24,34 @@ public class OpenSession implements DetachedAdminCommand { if (props.containsKey(DetachedSession.PROP_DO_IT_AGAIN_POLICY)) session.setDoItAgainPolicy(props .getProperty(DetachedSession.PROP_DO_IT_AGAIN_POLICY)); - + + String refreshedBundles = props + .getProperty("slc.detached.refreshedBundles"); + if (refreshedBundles != null) { + Bundle[] bundles = bundleContext.getBundles(); + Bundle bundle = null; + for (int i = 0; i < bundles.length; i++) { + if (bundles[i].getSymbolicName().equals(refreshedBundles)) { + bundle = bundles[i]; + } + } + + if (bundle != null) { + try { + bundle.stop(); + bundle.update(); + bundle.start(); + log.info("Refreshed bundle " + bundle.getSymbolicName()); + } catch (BundleException e) { + throw new DetachedException("Could not refresh bundle " + + bundle.getSymbolicName(), e); + } + } else { + log.warn("Did not find bundle to refresh " + refreshedBundles); + } + + } + return session; } } diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/drivers/AbstractDriver.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/drivers/AbstractDriver.java new file mode 100644 index 000000000..ac4851517 --- /dev/null +++ b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/drivers/AbstractDriver.java @@ -0,0 +1,56 @@ +package org.argeo.slc.detached.drivers; + +import org.argeo.slc.detached.DetachedAnswer; +import org.argeo.slc.detached.DetachedDriver; +import org.argeo.slc.detached.DetachedExecutionServer; +import org.argeo.slc.detached.DetachedRequest; + +public abstract class AbstractDriver implements DetachedDriver { + private boolean active = true; + private DetachedExecutionServer executionServer = null; + + public synchronized void start() { + + Thread driverThread = new Thread(new Runnable() { + + public void run() { + while (active) { + try { + DetachedRequest request = receiveRequest(); + if (!active) + break; + DetachedAnswer answer = executionServer + .executeStep(request); + sendAnswer(answer); + } catch (Exception e) { + if (e instanceof RuntimeException) + throw (RuntimeException) e; + else + e.printStackTrace(); + } + } + + } + }, "driverThread"); + driverThread.start(); + + } + + public void setExecutionServer(DetachedExecutionServer executionServer) { + this.executionServer = executionServer; + } + + public synchronized void stop() { + active = false; + notifyAll(); + } + + public synchronized boolean isActive() { + return active; + } + + public synchronized void setActive(boolean active) { + this.active = active; + } + +} diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/drivers/FileDriver.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/drivers/FileDriver.java index a4dfc892e..fafa3ebf6 100644 --- a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/drivers/FileDriver.java +++ b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/drivers/FileDriver.java @@ -9,15 +9,14 @@ import java.io.ObjectOutputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.argeo.slc.detached.DetachedAnswer; import org.argeo.slc.detached.DetachedClient; import org.argeo.slc.detached.DetachedCommunication; -import org.argeo.slc.detached.DetachedDriver; import org.argeo.slc.detached.DetachedException; -import org.argeo.slc.detached.DetachedAnswer; import org.argeo.slc.detached.DetachedRequest; import org.springframework.beans.factory.InitializingBean; -public class FileDriver implements DetachedDriver, DetachedClient, +public class FileDriver extends AbstractDriver implements DetachedClient, InitializingBean { private final static Log log = LogFactory.getLog(FileDriver.class); @@ -30,9 +29,10 @@ public class FileDriver implements DetachedDriver, DetachedClient, public synchronized DetachedRequest receiveRequest() throws Exception { DetachedRequest request = (DetachedRequest) receiveFile(requestsDir, processedRequestsDir); - log.debug("Received detached request #" + request.getUuid() - + " for ref '" + request.getRef() + "', path=" - + request.getPath()); + if (request != null) + log.debug("Received detached request #" + request.getUuid() + + " for ref '" + request.getRef() + "', path=" + + request.getPath()); return request; } @@ -44,7 +44,8 @@ public class FileDriver implements DetachedDriver, DetachedClient, public DetachedAnswer receiveAnswer() throws Exception { DetachedAnswer answer = (DetachedAnswer) receiveFile(answersDir, processedAnswersDir); - log.debug("Received detached answer #" + answer.getUuid()); + if (answer != null) + log.debug("Received detached answer #" + answer.getUuid()); return answer; } @@ -66,20 +67,28 @@ public class FileDriver implements DetachedDriver, DetachedClient, lockFile.delete(); } - protected DetachedCommunication receiveFile(File dir, File processedDir) - throws Exception { + protected synchronized DetachedCommunication receiveFile(File dir, + File processedDir) throws Exception { File file = null; - while (file == null) { + while (file == null && isActive()) { if (!dir.exists()) throw new DetachedException("Dir " + dir + " does not exist."); File[] files = dir.listFiles(); if (files.length > 0) file = files[0]; - else - Thread.sleep(1000); + else { + try { + wait(100); + } catch (InterruptedException e) { + // silent + } + } } + if (!isActive()) + return null; + File lockFile = nameLockFile(file); while (lockFile.exists()) // TODO: implements time out @@ -114,7 +123,15 @@ public class FileDriver implements DetachedDriver, DetachedClient, this.baseDir = baseDir; } - public void init() { + private void createIfNotExist(File dir) { + if (!dir.exists()) { + log.warn("Dir " + dir.getAbsolutePath() + + " does not exist. Creating it..."); + dir.mkdirs(); + } + } + + public void afterPropertiesSet() throws Exception { this.requestsDir = new File(baseDir.getAbsolutePath() + File.separator + "requests"); this.answersDir = new File(baseDir.getAbsolutePath() + File.separator @@ -130,16 +147,4 @@ public class FileDriver implements DetachedDriver, DetachedClient, createIfNotExist(processedAnswersDir); } - private void createIfNotExist(File dir) { - if (!dir.exists()) { - log.warn("Dir " + requestsDir.getAbsolutePath() - + " does not exist. Creating it..."); - dir.mkdirs(); - } - } - - public void afterPropertiesSet() throws Exception { - init(); - } - } diff --git a/org.argeo.slc.detached/src/main/resources/META-INF/MANIFEST.MF b/org.argeo.slc.detached/src/main/resources/META-INF/MANIFEST.MF index b1b3f0505..1d134d7c3 100644 --- a/org.argeo.slc.detached/src/main/resources/META-INF/MANIFEST.MF +++ b/org.argeo.slc.detached/src/main/resources/META-INF/MANIFEST.MF @@ -1,12 +1,13 @@ Manifest-Version: 1.0 -Export-Package: org.argeo.slc.detached.admin;uses:="org.osgi.framework - ,org.argeo.slc.detached",org.argeo.slc.detached;uses:="org.apache.com - mons.logging,org.springframework.context.support,org.springframework. - core.io,org.springframework.context,org.springframework.beans.factory - .xml,org.springframework.beans.factory.support,org.argeo.slc.detached - .admin,org.osgi.framework,org.springframework.beans.factory",org.arge - o.slc.detached.drivers;uses:="org.apache.commons.logging,org.argeo.sl - c.detached,org.springframework.beans.factory" +Export-Package: org.argeo.slc.detached.admin;uses:="org.apache.commons + .logging,org.osgi.framework,org.argeo.slc.detached",org.argeo.slc.det + ached;uses:="org.apache.commons.logging,org.springframework.context.s + upport,org.springframework.core.io,org.springframework.context,org.sp + ringframework.beans.factory.xml,org.argeo.slc.detached.drivers,org.sp + ringframework.beans.factory.support,org.argeo.slc.detached.admin,org. + osgi.framework,org.springframework.beans.factory",org.argeo.slc.detac + hed.drivers;uses:="org.apache.commons.logging,org.argeo.slc.detached, + org.springframework.beans.factory" Built-By: mbaudier Tool: Bnd-0.0.255 Bundle-Name: Argeo SLC Detached @@ -14,8 +15,9 @@ Created-By: Apache Maven Bundle Plugin Bundle-Vendor: Argeo Build-Jdk: 1.6.0 Bundle-Version: 0.11.1.SNAPSHOT -Bnd-LastModified: 1222949081084 +Bnd-LastModified: 1222954246943 Bundle-ManifestVersion: 2 +Bundle-Activator: org.argeo.slc.detached.Activator Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt Bundle-Description: SLC Distribution Import-Package: org.apache.commons.logging,org.argeo.slc.detached,org. diff --git a/org.argeo.slc.detached/src/main/resources/META-INF/spring/slc-detached.xml b/org.argeo.slc.detached/src/main/resources/META-INF/spring/slc-detached.xml new file mode 100644 index 000000000..1fab5f382 --- /dev/null +++ b/org.argeo.slc.detached/src/main/resources/META-INF/spring/slc-detached.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file -- 2.39.2