From 693cc53b426d088e49d746585bf7c5e197fc3998 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 17 Mar 2009 23:03:08 +0000 Subject: [PATCH] Introduce SLC Execution otification via JMS git-svn-id: https://svn.argeo.org/slc/trunk@2277 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- demo/site/.classpath | 6 ++ demo/site/.project | 12 +++ .../META-INF/spring/jms.xml | 11 +++ .../META-INF/spring/osgi.xml | 1 + .../conf/manager-osgi.xml | 1 + .../conf/manager.xml | 1 + demo/site/pom.xml | 9 +++ .../impl/process/SlcExecutionServiceImpl.java | 54 +++++++++++++ .../services/process/SlcExecutionService.java | 9 +++ .../slc/jms/JmsSlcExecutionNotifier.java | 49 +++++++++++ .../org/argeo/slc/activemq/destinations.xml | 7 ++ .../core/execution/DefaultModulesManager.java | 81 ++++++++++++------- .../bundles/logging/log4j.properties | 2 +- .../META-INF/spring/transaction-osgi.xml | 37 +++------ .../META-INF/spring/jms-osgi.xml | 2 + .../META-INF/spring/jms.xml | 21 +++++ .../META-INF/spring/services-osgi.xml | 52 ++++++------ .../META-INF/spring/services.xml | 4 + 18 files changed, 281 insertions(+), 78 deletions(-) create mode 100644 demo/site/.classpath create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/process/SlcExecutionServiceImpl.java create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/process/SlcExecutionService.java create mode 100644 runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsSlcExecutionNotifier.java diff --git a/demo/site/.classpath b/demo/site/.classpath new file mode 100644 index 000000000..d0bec0f76 --- /dev/null +++ b/demo/site/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/demo/site/.project b/demo/site/.project index 3bc0b024e..33d9f2693 100644 --- a/demo/site/.project +++ b/demo/site/.project @@ -5,7 +5,19 @@ + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature diff --git a/demo/site/org.argeo.slc.demo.agent/META-INF/spring/jms.xml b/demo/site/org.argeo.slc.demo.agent/META-INF/spring/jms.xml index f0214ef48..705e6e9c8 100644 --- a/demo/site/org.argeo.slc.demo.agent/META-INF/spring/jms.xml +++ b/demo/site/org.argeo.slc.demo.agent/META-INF/spring/jms.xml @@ -45,4 +45,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/demo/site/org.argeo.slc.demo.agent/META-INF/spring/osgi.xml b/demo/site/org.argeo.slc.demo.agent/META-INF/spring/osgi.xml index b6b025c2d..2ffd2d4d6 100644 --- a/demo/site/org.argeo.slc.demo.agent/META-INF/spring/osgi.xml +++ b/demo/site/org.argeo.slc.demo.agent/META-INF/spring/osgi.xml @@ -7,6 +7,7 @@ http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> + diff --git a/demo/site/org.argeo.slc.demo.manager/conf/manager-osgi.xml b/demo/site/org.argeo.slc.demo.manager/conf/manager-osgi.xml index 16d57c127..34bc15da5 100644 --- a/demo/site/org.argeo.slc.demo.manager/conf/manager-osgi.xml +++ b/demo/site/org.argeo.slc.demo.manager/conf/manager-osgi.xml @@ -15,4 +15,5 @@ + \ No newline at end of file diff --git a/demo/site/org.argeo.slc.demo.manager/conf/manager.xml b/demo/site/org.argeo.slc.demo.manager/conf/manager.xml index ba9fea471..da2842aef 100644 --- a/demo/site/org.argeo.slc.demo.manager/conf/manager.xml +++ b/demo/site/org.argeo.slc.demo.manager/conf/manager.xml @@ -6,5 +6,6 @@ + \ No newline at end of file diff --git a/demo/site/pom.xml b/demo/site/pom.xml index a278c001c..affcde423 100644 --- a/demo/site/pom.xml +++ b/demo/site/pom.xml @@ -17,4 +17,13 @@ org.argeo.slc.demo.deploy org.argeo.slc.demo.log4j + + + diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/process/SlcExecutionServiceImpl.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/process/SlcExecutionServiceImpl.java new file mode 100644 index 000000000..023988799 --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/process/SlcExecutionServiceImpl.java @@ -0,0 +1,54 @@ +package org.argeo.slc.services.impl.process; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.SlcException; +import org.argeo.slc.dao.process.SlcExecutionDao; +import org.argeo.slc.msg.process.SlcExecutionRequest; +import org.argeo.slc.msg.process.SlcExecutionStatusRequest; +import org.argeo.slc.process.SlcExecution; +import org.argeo.slc.services.process.SlcExecutionService; + +public class SlcExecutionServiceImpl implements SlcExecutionService { + private final Log log = LogFactory.getLog(getClass()); + + private final SlcExecutionDao slcExecutionDao; + + public SlcExecutionServiceImpl(SlcExecutionDao slcExecutionDao) { + this.slcExecutionDao = slcExecutionDao; + } + + public void newExecution(SlcExecution slcExecutionMsg) { + SlcExecution slcExecutionPersisted = slcExecutionDao + .getSlcExecution(slcExecutionMsg.getUuid()); + if (slcExecutionPersisted == null) { + if (log.isTraceEnabled()) + log.trace("Creating SLC execution #" + + slcExecutionMsg.getUuid()); + + slcExecutionDao.create(slcExecutionMsg); + } else { + if (log.isTraceEnabled()) + log.trace("Updating SLC execution #" + + slcExecutionMsg.getUuid()); + + slcExecutionDao.merge(slcExecutionMsg); + } + } + + public void updateStatus(SlcExecutionStatusRequest msg) { + SlcExecution slcExecution = slcExecutionDao.getSlcExecution(msg + .getSlcExecutionUuid()); + if (slcExecution == null) + throw new SlcException("Could not find SLC execution #" + + msg.getSlcExecutionUuid()); + + slcExecution.setStatus(msg.getNewStatus()); + + if (log.isTraceEnabled()) + log.trace("Updating status for SLC execution #" + + slcExecution.getUuid()); + + slcExecutionDao.update(slcExecution); + } +} diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/process/SlcExecutionService.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/process/SlcExecutionService.java new file mode 100644 index 000000000..9e617f743 --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/process/SlcExecutionService.java @@ -0,0 +1,9 @@ +package org.argeo.slc.services.process; + +import org.argeo.slc.msg.process.SlcExecutionStatusRequest; +import org.argeo.slc.process.SlcExecution; + +public interface SlcExecutionService { + public void newExecution(SlcExecution slcExecutionMsg); + public void updateStatus(SlcExecutionStatusRequest msg); +} diff --git a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsSlcExecutionNotifier.java b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsSlcExecutionNotifier.java new file mode 100644 index 000000000..5bdefc823 --- /dev/null +++ b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsSlcExecutionNotifier.java @@ -0,0 +1,49 @@ +package org.argeo.slc.jms; + +import java.util.List; + +import javax.jms.Destination; + +import org.argeo.slc.SlcException; +import org.argeo.slc.UnsupportedException; +import org.argeo.slc.msg.process.SlcExecutionStatusRequest; +import org.argeo.slc.process.SlcExecution; +import org.argeo.slc.process.SlcExecutionNotifier; +import org.argeo.slc.process.SlcExecutionStep; +import org.springframework.jms.core.JmsTemplate; + +public class JmsSlcExecutionNotifier implements SlcExecutionNotifier { + + private JmsTemplate jmsTemplate; + + private Destination updateStatusDestination; + + public void updateStatus(SlcExecution slcExecution, String oldStatus, + String newStatus) { + SlcExecutionStatusRequest req = new SlcExecutionStatusRequest( + slcExecution.getUuid(), newStatus); + jmsTemplate.convertAndSend(updateStatusDestination, req); + } + + public void addSteps(SlcExecution slcExecution, + List additionalSteps) { + throw new UnsupportedException(); + } + + public void newExecution(SlcExecution slcExecution) { + throw new UnsupportedException(); + } + + public void updateExecution(SlcExecution slcExecution) { + throw new UnsupportedException(); + } + + public void setJmsTemplate(JmsTemplate jmsTemplate) { + this.jmsTemplate = jmsTemplate; + } + + public void setUpdateStatusDestination(Destination updateStatusDestination) { + this.updateStatusDestination = updateStatusDestination; + } + +} diff --git a/runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/destinations.xml b/runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/destinations.xml index 8b27dfbd6..c72f98c85 100644 --- a/runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/destinations.xml +++ b/runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/destinations.xml @@ -5,6 +5,8 @@ default-lazy-init="false"> + + + + + + diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/DefaultModulesManager.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/DefaultModulesManager.java index 9bb6aae64..fdeb864a5 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/DefaultModulesManager.java +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/DefaultModulesManager.java @@ -2,6 +2,7 @@ package org.argeo.slc.core.execution; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -9,13 +10,14 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.slc.SlcException; import org.argeo.slc.execution.ExecutionContext; -import org.argeo.slc.execution.ExecutionFlow; import org.argeo.slc.execution.ExecutionFlowDescriptor; import org.argeo.slc.execution.ExecutionModule; import org.argeo.slc.execution.ExecutionModuleDescriptor; import org.argeo.slc.execution.ExecutionModulesManager; import org.argeo.slc.process.RealizedFlow; import org.argeo.slc.process.SlcExecution; +import org.argeo.slc.process.SlcExecutionNotifier; +import org.dbunit.operation.UpdateOperation; import org.springframework.util.Assert; public class DefaultModulesManager implements ExecutionModulesManager { @@ -23,22 +25,24 @@ public class DefaultModulesManager implements ExecutionModulesManager { .getLog(DefaultModulesManager.class); private List executionModules = new ArrayList(); - - protected ExecutionModule getExecutionModule(String moduleName, String version) { + private List slcExecutionNotifiers = new ArrayList(); + + protected ExecutionModule getExecutionModule(String moduleName, + String version) { for (ExecutionModule moduleT : executionModules) { if (moduleT.getName().equals(moduleName)) { - if(moduleT.getVersion().equals(version)) { + if (moduleT.getVersion().equals(version)) { return moduleT; } } } return null; } - + public ExecutionModuleDescriptor getExecutionModuleDescriptor( String moduleName, String version) { ExecutionModule module = getExecutionModule(moduleName, version); - + Assert.notNull(module); return module.getDescriptor(); @@ -52,44 +56,63 @@ public class DefaultModulesManager implements ExecutionModulesManager { this.executionModules = executionModules; } - protected Map convertValues(ExecutionFlowDescriptor executionFlowDescriptor) { + protected Map convertValues( + ExecutionFlowDescriptor executionFlowDescriptor) { // convert the values of flow.getFlowDescriptor() Map values = executionFlowDescriptor.getValues(); - + Map convertedValues = new HashMap(); - - for(String key : values.keySet()) { + + for (String key : values.keySet()) { Object value = values.get(key); - if(value instanceof PrimitiveValue) { + if (value instanceof PrimitiveValue) { PrimitiveValue primitiveValue = (PrimitiveValue) value; - // TODO: check that the class of the the primitiveValue.value matches + // TODO: check that the class of the the primitiveValue.value + // matches // the primitiveValue.type convertedValues.put(key, primitiveValue.getValue()); - } - else if(value instanceof RefValue) { + } else if (value instanceof RefValue) { RefValue refValue = (RefValue) value; convertedValues.put(key, refValue.getLabel()); } - } + } return convertedValues; } - + public void process(SlcExecution slcExecution) { - log.info("##\n## Process SLC Execution " + slcExecution+"\n##"); + log.info("\n##\n## Process SLC Execution " + slcExecution + "\n##\n"); - for(RealizedFlow flow : slcExecution.getRealizedFlows()) { + for (RealizedFlow flow : slcExecution.getRealizedFlows()) { ExecutionModule module = getExecutionModule(flow.getModuleName(), flow.getModuleVersion()); - if(module != null) { - ExecutionThread thread = new ExecutionThread(flow.getFlowDescriptor(), module); + if (module != null) { + ExecutionThread thread = new ExecutionThread(flow + .getFlowDescriptor(), module); thread.start(); - } - else { - throw new SlcException("ExecutionModule " + flow.getModuleName() + ", version " + } else { + throw new SlcException("ExecutionModule " + + flow.getModuleName() + ", version " + flow.getModuleVersion() + " not found."); } } + + slcExecution.setStatus(SlcExecution.STATUS_RUNNING); + dispatchUpdateStatus(slcExecution, SlcExecution.STATUS_SCHEDULED, + SlcExecution.STATUS_RUNNING); + } + + protected void dispatchUpdateStatus(SlcExecution slcExecution, + String oldStatus, String newStatus) { + for (Iterator it = slcExecutionNotifiers + .iterator(); it.hasNext();) { + it.next().updateStatus(slcExecution, oldStatus, newStatus); + } + } + + public void setSlcExecutionNotifiers( + List slcExecutionNotifiers) { + this.slcExecutionNotifiers = slcExecutionNotifiers; } private class ExecutionThread extends Thread { @@ -98,21 +121,23 @@ public class DefaultModulesManager implements ExecutionModulesManager { public ExecutionThread(ExecutionFlowDescriptor executionFlowDescriptor, ExecutionModule executionModule) { - super("SLC Execution #" /*+ executionContext.getUuid()*/); + super("SLC Execution #" /* + executionContext.getUuid() */); this.executionFlowDescriptor = executionFlowDescriptor; this.executionModule = executionModule; } public void run() { - ExecutionContext executionContext = executionModule.getExecutionContext(); - executionContext.addVariables(convertValues(executionFlowDescriptor)); + ExecutionContext executionContext = executionModule + .getExecutionContext(); + executionContext + .addVariables(convertValues(executionFlowDescriptor)); try { executionModule.execute(executionFlowDescriptor); } catch (Exception e) { - //TODO: re-throw exception ? + // TODO: re-throw exception ? log.error("Execution " + executionContext.getUuid() + " failed.", e); } } - } + } } diff --git a/server/org.argeo.slc.siteserver/bundles/logging/log4j.properties b/server/org.argeo.slc.siteserver/bundles/logging/log4j.properties index 0d4757ef4..f8b5d3e8a 100644 --- a/server/org.argeo.slc.siteserver/bundles/logging/log4j.properties +++ b/server/org.argeo.slc.siteserver/bundles/logging/log4j.properties @@ -5,7 +5,7 @@ log4j.logger.org.argeo=DEBUG log4j.logger.org.argeo.slc.execution.ExecutionParameterPostProcessor=TRACE log4j.logger.org.argeo.slc.execution.ExecutionContext=DEBUG log4j.logger.org.argeo.slc.execution.SimpleExecutionSpec=DEBUG -log4j.logger.org.argeo.slc.services.impl=DEBUG +log4j.logger.org.argeo.slc.services.impl=TRACE log4j.logger.org.springframework=WARN diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.hibernate/META-INF/spring/transaction-osgi.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.hibernate/META-INF/spring/transaction-osgi.xml index 08c04583a..d74c5d5f0 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.hibernate/META-INF/spring/transaction-osgi.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.hibernate/META-INF/spring/transaction-osgi.xml @@ -1,25 +1,14 @@ - - - - - - - - - - - - - + + + + + + + \ No newline at end of file diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms-osgi.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms-osgi.xml index 70390b6c4..8e68b5535 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms-osgi.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms-osgi.xml @@ -9,6 +9,8 @@ + diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms.xml index 607bd0c08..5e1687d78 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms.xml @@ -58,6 +58,27 @@ + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services.xml index fe2aa9173..debb1c458 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services.xml @@ -19,6 +19,10 @@ + + + +