From a9bd656db864f3f648d375deef6833c2f53f29ba Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 28 Apr 2009 08:14:49 +0000 Subject: [PATCH] Make jms more robust git-svn-id: https://svn.argeo.org/slc/trunk@2386 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- demo/pom.xml | 43 ++++- .../impl/runtime/AgentServiceImpl.java | 64 +++++++- .../dao/runtime/SlcAgentDescriptorDao.java | 3 + .../java/org/argeo/slc/runtime/SlcAgent.java | 5 + .../main/java/org/argeo/slc/jms/JmsAgent.java | 152 ++++++++++-------- .../java/org/argeo/slc/jms/JmsAgentProxy.java | 112 ++++++++++--- .../slc/jms/JmsTransferNewExecution.java | 55 ++++--- .../SlcAgentDescriptorDaoHibernate.java | 13 ++ .../argeo/slc/core/runtime/AbstractAgent.java | 2 +- .../org/argeo/slc/msg/ExecutionAnswer.java | 14 ++ .../META-INF/MANIFEST.MF | 4 +- .../META-INF/spring/activemq-osgi.xml | 2 + .../META-INF/spring/activemq.xml | 31 ++-- .../META-INF/MANIFEST.MF | 2 +- .../META-INF/spring/jms-osgi.xml | 2 +- .../META-INF/spring/jms.xml | 15 +- .../META-INF/spring/services-osgi.xml | 9 +- .../META-INF/spring/services.xml | 27 ++-- 18 files changed, 397 insertions(+), 158 deletions(-) diff --git a/demo/pom.xml b/demo/pom.xml index e4f569132..7265e29fc 100644 --- a/demo/pom.xml +++ b/demo/pom.xml @@ -58,7 +58,9 @@ target/exec/server -Xmx256m - + @@ -91,7 +93,9 @@ target/exec/agent -Xmx128m - + @@ -107,5 +111,40 @@ + + server_mysql + + + + org.argeo.slc.maven + maven-argeo-osgi-plugin + + target/exec/server + + -Xmx256m + + + + + org.argeo.dep.osgi.catalina.start, + org.springframework.osgi.extender, + org.springframework.osgi.web.extender, + org.springframework.osgi.samples.simplewebapp, + org.argeo.slc.server.activemq, + org.argeo.slc.server.mysql, + org.argeo.slc.server.hibernate, + org.argeo.slc.server.services, + org.argeo.slc.server.jms, + org.argeo.slc.webapp, + org.argeo.slc.ria + + + + + + + diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/runtime/AgentServiceImpl.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/runtime/AgentServiceImpl.java index 0f127269f..1f2397a09 100644 --- a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/runtime/AgentServiceImpl.java +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/runtime/AgentServiceImpl.java @@ -1,18 +1,33 @@ package org.argeo.slc.services.impl.runtime; +import java.util.ArrayList; +import java.util.List; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.slc.dao.runtime.SlcAgentDescriptorDao; +import org.argeo.slc.runtime.SlcAgent; import org.argeo.slc.runtime.SlcAgentDescriptor; +import org.argeo.slc.runtime.SlcAgentFactory; import org.argeo.slc.services.runtime.AgentService; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; -public class AgentServiceImpl implements AgentService { +public class AgentServiceImpl implements AgentService, InitializingBean, + DisposableBean { private final static Log log = LogFactory.getLog(AgentServiceImpl.class); private final SlcAgentDescriptorDao slcAgentDescriptorDao; + private final SlcAgentFactory agentFactory; + + private Long pingCycle = 60000l; - public AgentServiceImpl(SlcAgentDescriptorDao slcAgentDescriptorDao) { + private Boolean pingThreadActive = true; + + public AgentServiceImpl(SlcAgentDescriptorDao slcAgentDescriptorDao, + SlcAgentFactory agentFactory) { this.slcAgentDescriptorDao = slcAgentDescriptorDao; + this.agentFactory = agentFactory; } public void register(SlcAgentDescriptor slcAgentDescriptor) { @@ -25,4 +40,49 @@ public class AgentServiceImpl implements AgentService { log.info("Unregistered agent #" + slcAgentDescriptor.getUuid()); } + public void afterPropertiesSet() throws Exception { + if (pingCycle > 0) + new PingThread().start(); + } + + public synchronized void destroy() throws Exception { + pingThreadActive = false; + notifyAll(); + } + + public void setPingCycle(Long pingCycle) { + this.pingCycle = pingCycle; + } + + protected class PingThread extends Thread { + public void run() { + while (pingThreadActive) { + List lst = slcAgentDescriptorDao + .listSlcAgentDescriptors(); + List agentIds = new ArrayList(); + for (SlcAgentDescriptor ad : lst) + agentIds.add(ad.getUuid()); + + if (log.isDebugEnabled()) + log.debug("Ping " + agentIds.size() + " agent."); + for (String agentId : agentIds) { + SlcAgent agent = agentFactory.getAgent(agentId); + if (!agent.ping()) { + log.info("Agent " + agentId + " did not reply to ping," + + " removing its descriptor..."); + slcAgentDescriptorDao.delete(agentId); + } + } + + synchronized (AgentServiceImpl.this) { + try { + AgentServiceImpl.this.wait(pingCycle); + } catch (InterruptedException e) { + // silent + } + } + } + } + + } } diff --git a/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/dao/runtime/SlcAgentDescriptorDao.java b/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/dao/runtime/SlcAgentDescriptorDao.java index 3709968c3..cb8184dc9 100644 --- a/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/dao/runtime/SlcAgentDescriptorDao.java +++ b/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/dao/runtime/SlcAgentDescriptorDao.java @@ -9,6 +9,9 @@ public interface SlcAgentDescriptorDao { public void delete(SlcAgentDescriptor slcAgentDescriptor); + public void delete(String agentId); + public List listSlcAgentDescriptors(); + public SlcAgentDescriptor getAgentDescriptor(String agentId); } diff --git a/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/runtime/SlcAgent.java b/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/runtime/SlcAgent.java index a0bb783d0..b97aa6e90 100644 --- a/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/runtime/SlcAgent.java +++ b/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/runtime/SlcAgent.java @@ -3,6 +3,7 @@ package org.argeo.slc.runtime; import java.util.List; import org.argeo.slc.execution.ExecutionModuleDescriptor; +import org.argeo.slc.process.SlcExecution; /** A local agent, able to run SLC Execution locally. */ public interface SlcAgent { @@ -11,4 +12,8 @@ public interface SlcAgent { public List listExecutionModuleDescriptors(); + public void runSlcExecution(SlcExecution slcExecution); + + /** @return true if still alive. */ + public boolean ping(); } diff --git a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgent.java b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgent.java index baddb1c60..6882ebaa4 100644 --- a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgent.java +++ b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgent.java @@ -9,8 +9,7 @@ import java.util.UUID; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; -import javax.jms.MessageProducer; -import javax.jms.Session; +import javax.jms.MessageListener; import javax.jms.TextMessage; import org.apache.commons.logging.Log; @@ -19,34 +18,30 @@ import org.argeo.slc.SlcException; import org.argeo.slc.core.runtime.AbstractAgent; import org.argeo.slc.execution.ExecutionModule; import org.argeo.slc.execution.ExecutionModuleDescriptor; +import org.argeo.slc.msg.ExecutionAnswer; import org.argeo.slc.process.SlcExecution; import org.argeo.slc.runtime.SlcAgent; import org.argeo.slc.runtime.SlcAgentDescriptor; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.jms.core.JmsTemplate; -import org.springframework.jms.listener.SessionAwareMessageListener; -import org.springframework.jms.support.converter.MessageConversionException; +import org.springframework.jms.core.MessagePostProcessor; /** JMS based implementation of SLC Agent. */ public class JmsAgent extends AbstractAgent implements SlcAgent, - InitializingBean, DisposableBean, SessionAwareMessageListener { + InitializingBean, DisposableBean, MessageListener { public final static String PROPERTY_QUERY = "query"; public final static String PROPERTY_SLC_AGENT_ID = "slc_agentId"; private final static Log log = LogFactory.getLog(JmsAgent.class); private final SlcAgentDescriptor agentDescriptor; - // private ConnectionFactory connectionFactory; private JmsTemplate jmsTemplate; private Destination agentRegister; private Destination agentUnregister; - // private Destination requestDestination; private Destination responseDestination; - // private MessageConverter messageConverter; - public JmsAgent() { try { agentDescriptor = new SlcAgentDescriptor(); @@ -58,10 +53,6 @@ public class JmsAgent extends AbstractAgent implements SlcAgent, } public void afterPropertiesSet() throws Exception { - // Initialize JMS Template - // jmsTemplate = new JmsTemplate(connectionFactory); - // jmsTemplate.setMessageConverter(messageConverter); - jmsTemplate.convertAndSend(agentRegister, agentDescriptor); log.info("Agent #" + agentDescriptor.getUuid() + " registered to " + agentRegister); @@ -89,62 +80,6 @@ public class JmsAgent extends AbstractAgent implements SlcAgent, return messageSelector; } - public void onMessage(Message message, Session session) throws JMSException { - MessageProducer producer = session.createProducer(responseDestination); - String query = message.getStringProperty(PROPERTY_QUERY); - String correlationId = message.getJMSCorrelationID(); - if (log.isDebugEnabled()) - log.debug("Received query " + query + " with correlationId " - + correlationId); - - Message responseMsg = null; - if ("getExecutionModuleDescriptor".equals(query)) { - String moduleName = message.getStringProperty("moduleName"); - String version = message.getStringProperty("version"); - ExecutionModuleDescriptor emd = getExecutionModuleDescriptor( - moduleName, version); - responseMsg = jmsTemplate.getMessageConverter().toMessage(emd, - session); - } else if ("listExecutionModuleDescriptors".equals(query)) { - - List lst = listExecutionModuleDescriptors(); - SlcAgentDescriptor agentDescriptorToSend = new SlcAgentDescriptor( - agentDescriptor); - agentDescriptorToSend.setModuleDescriptors(lst); - responseMsg = jmsTemplate.getMessageConverter().toMessage( - agentDescriptorToSend, session); - } else if ("newExecution".equals(query)) { - - SlcExecution slcExecution = (SlcExecution) jmsTemplate - .getMessageConverter().fromMessage(message); - runSlcExecution(slcExecution); - return; - } else { - // try { - // // FIXME: generalize - // SlcExecution slcExecution = (SlcExecution) jmsTemplate - // .getMessageConverter().fromMessage(message); - // runSlcExecution(slcExecution); - // } catch (MessageConversionException e) { - // if (log.isDebugEnabled()) - // log.debug("Unsupported query " + query, e); - // } - if (log.isDebugEnabled()) - log.debug("Unsupported query " + query); - return; - } - - if (responseMsg != null) { - responseMsg.setJMSCorrelationID(correlationId); - producer.send(responseMsg); - if (log.isDebugEnabled()) - log.debug("Sent response to query " + query - + " with correlationId " + correlationId + ": " - + responseMsg); - } - - } - public ExecutionModuleDescriptor getExecutionModuleDescriptor( String moduleName, String version) { return getModulesManager().getExecutionModuleDescriptor(moduleName, @@ -165,6 +100,85 @@ public class JmsAgent extends AbstractAgent implements SlcAgent, return descriptors; } + public boolean ping() { + return true; + } + + public void onMessage(final Message message) { + final String query; + final String correlationId; + try { + query = message.getStringProperty(PROPERTY_QUERY); + correlationId = message.getJMSCorrelationID(); + } catch (JMSException e1) { + throw new SlcException("Cannot analyze incoming message " + message); + } + + final Object response = process(query, message); + + new Thread() { + public void run() { + // Send response + jmsTemplate.convertAndSend(responseDestination, response, + new MessagePostProcessor() { + public Message postProcessMessage( + Message messageToSend) throws JMSException { + messageToSend + .setStringProperty( + PROPERTY_QUERY, + message + .getStringProperty(PROPERTY_QUERY)); + messageToSend.setStringProperty( + PROPERTY_SLC_AGENT_ID, agentDescriptor + .getUuid()); + messageToSend.setJMSCorrelationID(message + .getJMSCorrelationID()); + return messageToSend; + } + }); + if (log.isDebugEnabled()) + log.debug("Sent response to query " + query + + " with correlationId " + correlationId); + } + }.start(); + + } + + /** @return response */ + public Object process(String query, Message message) { + try { + if ("getExecutionModuleDescriptor".equals(query)) { + String moduleName = message.getStringProperty("moduleName"); + String version = message.getStringProperty("version"); + return getExecutionModuleDescriptor(moduleName, version); + } else if ("listExecutionModuleDescriptors".equals(query)) { + + List lst = listExecutionModuleDescriptors(); + SlcAgentDescriptor agentDescriptorToSend = new SlcAgentDescriptor( + agentDescriptor); + agentDescriptorToSend.setModuleDescriptors(lst); + return agentDescriptorToSend; + } else if ("runSlcExecution".equals(query)) { + SlcExecution slcExecution = (SlcExecution) convertFrom(message); + runSlcExecution(slcExecution); + return ExecutionAnswer.ok("Execution started on agent " + + agentDescriptor.getUuid()); + } else if ("ping".equals(query)) { + return ExecutionAnswer.ok("Agent " + agentDescriptor.getUuid() + + " is alive."); + } else { + throw new SlcException("Unsupported query " + query); + } + } catch (Exception e) { + log.error("Processing of query " + query + " failed", e); + return ExecutionAnswer.error(e); + } + } + + protected Object convertFrom(Message message) throws JMSException { + return jmsTemplate.getMessageConverter().fromMessage(message); + } + public void setResponseDestination(Destination responseDestination) { this.responseDestination = responseDestination; } diff --git a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgentProxy.java b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgentProxy.java index 66cf3920e..8837a8155 100644 --- a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgentProxy.java +++ b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgentProxy.java @@ -13,6 +13,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.slc.SlcException; import org.argeo.slc.execution.ExecutionModuleDescriptor; +import org.argeo.slc.msg.ExecutionAnswer; +import org.argeo.slc.process.SlcExecution; import org.argeo.slc.runtime.SlcAgent; import org.argeo.slc.runtime.SlcAgentDescriptor; import org.springframework.jms.core.JmsTemplate; @@ -40,7 +42,7 @@ public class JmsAgentProxy implements SlcAgent { public ExecutionModuleDescriptor getExecutionModuleDescriptor( final String moduleName, final String version) { - return (ExecutionModuleDescriptor) sendReceive(new AgentProxyMessageCreator( + return (ExecutionModuleDescriptor) sendReceive(new AgentMC( "getExecutionModuleDescriptor") { public void setArguments(Message message) throws JMSException { message.setStringProperty("moduleName", moduleName); @@ -50,46 +52,112 @@ public class JmsAgentProxy implements SlcAgent { } public List listExecutionModuleDescriptors() { - return ((SlcAgentDescriptor) sendReceive(new AgentProxyMessageCreator( + return ((SlcAgentDescriptor) sendReceive(new AgentMC( "listExecutionModuleDescriptors"))).getModuleDescriptors(); } - protected Object sendReceive(AgentProxyMessageCreator messageCreator) { + public void runSlcExecution(SlcExecution slcExecution) { + sendReceive(new AgentMC("runSlcExecution", slcExecution)); + } + + public boolean ping() { + Object response = sendReceive(new AgentMC("ping"), false); + if (response == null) + return false; + else { + ExecutionAnswer answer = (ExecutionAnswer) response; + return ExecutionAnswer.OK.equals(answer.getStatus()); + } + } + + protected Object sendReceive(AgentMC messageCreator) { + return sendReceive(messageCreator, true); + } + + /** + * @param timeoutException + * if true throws an exception if reception timeouted, else + * return null + */ + protected Object sendReceive(AgentMC messageCreator, + boolean timeoutException) { String correlationId = UUID.randomUUID().toString(); messageCreator.setCorrelationId(correlationId); send(messageCreator); - return processResponse(correlationId); + + Object response = processResponse(messageCreator, timeoutException); + + if (response instanceof ExecutionAnswer) { + ExecutionAnswer answer = (ExecutionAnswer) response; + if (ExecutionAnswer.ERROR.equals(answer.getStatus())) + throw new SlcException("Execution of '" + + messageCreator.getQuery() + "' failed on the agent " + + agentUuid + ": " + answer.getMessage() + + " (correlationId=" + correlationId + ")"); + else + return answer; + } else { + return response; + } } - protected void send(AgentProxyMessageCreator messageCreator) { + protected void send(AgentMC messageCreator) { jmsTemplate.send(requestDestination, messageCreator); if (log.isDebugEnabled()) - log.debug("Sent request" + messageCreator.getQuery() + " to agent " - + agentUuid + " with correlationId " - + messageCreator.getCorrelationId()); + log.debug("Sent query '" + messageCreator.getQuery() + + "' with correlationId " + + messageCreator.getCorrelationId() + " to agent " + + agentUuid); } - protected Object processResponse(String correlationId) { + protected Object processResponse(AgentMC messageCreator, + boolean timeoutException) { + String correlationId = messageCreator.getCorrelationId(); + String query = messageCreator.getQuery(); + Message responseMsg = null; + try { + responseMsg = jmsTemplate.receiveSelected(responseDestination, + "JMSCorrelationID='" + correlationId + "'"); + } catch (Exception e) { + throw new SlcException("Could not receive response from agent " + + agentUuid + " with correlationId " + correlationId + + " (query '" + query + "')", e); + } + + if (responseMsg == null) {// timeout + if (timeoutException) + throw new SlcException("TIMEOUT: Query '" + query + "'" + + " with correlationId " + correlationId + + " sent to agent " + agentUuid + " timed out."); + else + return null; + } + if (log.isDebugEnabled()) + log.debug("Received response for query '" + query + + "' with correlationId " + correlationId + " from agent " + + agentUuid); + try { - Message responseMsg = jmsTemplate.receiveSelected( - responseDestination, "JMSCorrelationID='" + correlationId - + "'"); - if (log.isDebugEnabled()) - log.debug("Received response with correlationId " - + correlationId); return messageConverter.fromMessage(responseMsg); } catch (Exception e) { - throw new SlcException("Could not process response from agent " - + agentUuid + " with correlationId " + correlationId, e); + throw new SlcException("Could not convert response from agent " + + agentUuid + " with correlationId " + correlationId + + " (query '" + query + "')", e); } } - protected class AgentProxyMessageCreator implements MessageCreator { + protected class AgentMC implements MessageCreator { private final String query; + private Object body = null; private String correlationId; - public AgentProxyMessageCreator(String query) { + public AgentMC(String query) { + this.query = query; + } + + public AgentMC(String query, Object body) { this.query = query; + this.body = body; } public final Message createMessage(Session session) throws JMSException { @@ -97,7 +165,11 @@ public class JmsAgentProxy implements SlcAgent { throw new SlcException("Agent UUID not set"); if (correlationId == null) throw new SlcException("JMSCorrelationID not set"); - TextMessage msg = session.createTextMessage(); + final Message msg; + if (body == null) + msg = session.createTextMessage(); + else + msg = messageConverter.toMessage(body, session); msg.setStringProperty(JmsAgent.PROPERTY_SLC_AGENT_ID, agentUuid); msg.setStringProperty(JmsAgent.PROPERTY_QUERY, query); msg.setJMSCorrelationID(correlationId); diff --git a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsTransferNewExecution.java b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsTransferNewExecution.java index 856b956a4..28913aea8 100644 --- a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsTransferNewExecution.java +++ b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsTransferNewExecution.java @@ -1,34 +1,43 @@ package org.argeo.slc.jms; -import java.util.UUID; - -import javax.jms.Destination; -import javax.jms.JMSException; import javax.jms.Message; -import javax.jms.MessageProducer; -import javax.jms.Session; -import javax.jms.TextMessage; +import javax.jms.MessageListener; + +import org.argeo.slc.SlcException; +import org.argeo.slc.process.SlcExecution; +import org.argeo.slc.runtime.SlcAgent; +import org.argeo.slc.runtime.SlcAgentFactory; +import org.springframework.jms.support.converter.MessageConverter; -import org.springframework.jms.listener.SessionAwareMessageListener; +/** Temporary hack */ +public class JmsTransferNewExecution implements MessageListener { + private MessageConverter messageConverter; + private SlcAgentFactory agentFactory; -/** Temporary hack*/ -public class JmsTransferNewExecution implements SessionAwareMessageListener { - private Destination requestDestination; + public void onMessage(final Message message) { + try { + String agentId = message + .getStringProperty(JmsAgent.PROPERTY_SLC_AGENT_ID); + final SlcAgent agent = agentFactory.getAgent(agentId); + final SlcExecution slcExecution = (SlcExecution) messageConverter + .fromMessage(message); + new Thread() { + public void run() { + agent.runSlcExecution(slcExecution); + } + }.start(); + } catch (Exception e) { + throw new SlcException("Could not transfer new execution " + + message, e); + } + } - public void onMessage(Message message, Session session) throws JMSException { - TextMessage messageToSend = session - .createTextMessage(((TextMessage) message).getText()); - messageToSend - .setStringProperty(JmsAgent.PROPERTY_QUERY, "newExecution"); - messageToSend.setStringProperty(JmsAgent.PROPERTY_SLC_AGENT_ID, message - .getStringProperty(JmsAgent.PROPERTY_SLC_AGENT_ID)); - messageToSend.setJMSCorrelationID(UUID.randomUUID().toString()); - MessageProducer producer = session.createProducer(requestDestination); - producer.send(messageToSend); + public void setMessageConverter(MessageConverter messageConverter) { + this.messageConverter = messageConverter; } - public void setRequestDestination(Destination requestDestination) { - this.requestDestination = requestDestination; + public void setAgentFactory(SlcAgentFactory agentFactory) { + this.agentFactory = agentFactory; } } diff --git a/runtime/org.argeo.slc.support.hibernate/src/main/java/org/argeo/slc/hibernate/runtime/SlcAgentDescriptorDaoHibernate.java b/runtime/org.argeo.slc.support.hibernate/src/main/java/org/argeo/slc/hibernate/runtime/SlcAgentDescriptorDaoHibernate.java index 6fead8d8d..adb96e325 100644 --- a/runtime/org.argeo.slc.support.hibernate/src/main/java/org/argeo/slc/hibernate/runtime/SlcAgentDescriptorDaoHibernate.java +++ b/runtime/org.argeo.slc.support.hibernate/src/main/java/org/argeo/slc/hibernate/runtime/SlcAgentDescriptorDaoHibernate.java @@ -17,6 +17,19 @@ public class SlcAgentDescriptorDaoHibernate extends HibernateDaoSupport getHibernateTemplate().delete(slcAgentDescriptor); } + public void delete(String agentId) { + Object obj = getHibernateTemplate().get(SlcAgentDescriptor.class, + agentId); + if (obj != null) + getHibernateTemplate().delete(obj); + } + + public SlcAgentDescriptor getAgentDescriptor(String agentId) { + + return (SlcAgentDescriptor) getHibernateTemplate().get( + SlcAgentDescriptor.class, agentId); + } + public List listSlcAgentDescriptors() { return (List) getHibernateTemplate().loadAll( SlcAgentDescriptor.class); diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/runtime/AbstractAgent.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/runtime/AbstractAgent.java index 75215115e..c7a419c65 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/runtime/AbstractAgent.java +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/runtime/AbstractAgent.java @@ -8,7 +8,7 @@ public abstract class AbstractAgent { private ExecutionModulesManager modulesManager; - protected void runSlcExecution(final SlcExecution slcExecution) { + public void runSlcExecution(final SlcExecution slcExecution) { modulesManager.process(slcExecution); } diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/ExecutionAnswer.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/ExecutionAnswer.java index e113f98bb..0ae20be70 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/ExecutionAnswer.java +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/ExecutionAnswer.java @@ -1,5 +1,9 @@ package org.argeo.slc.msg; +import java.io.PrintWriter; +import java.io.StringWriter; + +import org.apache.commons.io.IOUtils; import org.argeo.slc.SlcException; /** Answer to an execution of a remote service which performed changes. */ @@ -44,6 +48,16 @@ public class ExecutionAnswer { return new ExecutionAnswer(ERROR, message); } + public static ExecutionAnswer error(Throwable e) { + StringWriter writer = new StringWriter(); + try { + e.printStackTrace(new PrintWriter(writer)); + return new ExecutionAnswer(ERROR, writer.toString()); + } finally { + IOUtils.closeQuietly(writer); + } + } + public static ExecutionAnswer ok(String message) { return new ExecutionAnswer(OK, message); } diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.activemq/META-INF/MANIFEST.MF b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.activemq/META-INF/MANIFEST.MF index 08b00f5f4..e7fa0c18a 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.activemq/META-INF/MANIFEST.MF +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.activemq/META-INF/MANIFEST.MF @@ -5,7 +5,9 @@ Import-Package: javax.jms, org.apache.commons.logging, org.apache.activemq.pool, org.apache.commons.pool -Require-Bundle: org.argeo.slc.server, +Require-Bundle: + org.argeo.slc.specs, + org.argeo.slc.server, org.argeo.slc.support.activemq, org.springframework.core, org.springframework.context, diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.activemq/META-INF/spring/activemq-osgi.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.activemq/META-INF/spring/activemq-osgi.xml index 789db5f62..f617c281b 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.activemq/META-INF/spring/activemq-osgi.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.activemq/META-INF/spring/activemq-osgi.xml @@ -8,4 +8,6 @@ + + \ No newline at end of file diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.activemq/META-INF/spring/activemq.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.activemq/META-INF/spring/activemq.xml index ef27997d3..669582083 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.activemq/META-INF/spring/activemq.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.activemq/META-INF/spring/activemq.xml @@ -24,16 +24,15 @@ - + vm://localhost + + --> @@ -52,4 +51,18 @@ --> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jdbc/META-INF/MANIFEST.MF b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jdbc/META-INF/MANIFEST.MF index 12f9325bc..391fff9ff 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jdbc/META-INF/MANIFEST.MF +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jdbc/META-INF/MANIFEST.MF @@ -1,5 +1,5 @@ Bundle-SymbolicName: org.argeo.slc.server.jdbc -Bundle-Version: 1.0.0 +Bundle-Version: 0.11.3.qualifier Fragment-Host: org.springframework.jdbc Import-Package: org.hsqldb;resolution:=optional, 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 1abc49736..6c41418a6 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 @@ -14,5 +14,5 @@ - + \ No newline at end of file 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 b2000f625..24cb545bb 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 @@ -6,18 +6,6 @@ - - - - - - - - - - - - @@ -43,7 +31,8 @@ - + + diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services-osgi.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services-osgi.xml index 04c557c55..f486d9dee 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services-osgi.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services-osgi.xml @@ -22,7 +22,12 @@ - + + + \ 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 e93f04885..6ae0a3b85 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 @@ -17,23 +17,22 @@ + + - + - + \ No newline at end of file -- 2.39.2