]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgentProxy.java
Implement kill and process progress
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.activemq / src / main / java / org / argeo / slc / jms / JmsAgentProxy.java
index b743f12e1fb25cefd2726227e7dc8eafeddcc1b4..8c08519371afdfe06c246c96775b3fbbaf892ef7 100644 (file)
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package org.argeo.slc.jms;
 
 import java.util.List;
@@ -7,12 +23,15 @@ import javax.jms.Destination;
 import javax.jms.JMSException;
 import javax.jms.Message;
 import javax.jms.Session;
+import javax.jms.TextMessage;
 
 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.execution.ExecutionProcess;
 import org.argeo.slc.msg.ExecutionAnswer;
+import org.argeo.slc.msg.MsgConstants;
 import org.argeo.slc.process.SlcExecution;
 import org.argeo.slc.runtime.SlcAgent;
 import org.argeo.slc.runtime.SlcAgentDescriptor;
@@ -35,6 +54,10 @@ public class JmsAgentProxy implements SlcAgent {
                this.jmsTemplate = jmsTemplate;
        }
 
+       public String getAgentUuid() {
+               return agentUuid;
+       }
+
        public ExecutionModuleDescriptor getExecutionModuleDescriptor(
                        final String moduleName, final String version) {
                return (ExecutionModuleDescriptor) sendReceive(new AgentMC(
@@ -52,7 +75,15 @@ public class JmsAgentProxy implements SlcAgent {
        }
 
        public void runSlcExecution(SlcExecution slcExecution) {
-               sendReceive(new AgentMC("runSlcExecution", slcExecution));
+               process(slcExecution);
+       }
+
+       public void process(ExecutionProcess executionProcess) {
+               if (!(executionProcess instanceof SlcExecution))
+                       throw new SlcException("Unsupported process type "
+                                       + executionProcess.getClass());
+               sendReceive(new AgentMC("runSlcExecution",
+                               (SlcExecution) executionProcess));
        }
 
        public boolean ping() {
@@ -65,8 +96,23 @@ public class JmsAgentProxy implements SlcAgent {
                }
        }
 
+       public void kill(ExecutionProcess process) {
+               throw new UnsupportedOperationException();
+       }
+
        protected Object sendReceive(AgentMC messageCreator) {
-               return sendReceive(messageCreator, true);
+               long begin = System.currentTimeMillis();
+               Object res;
+               try {
+                       res = sendReceive(messageCreator, true);
+               } finally {
+                       if (log.isTraceEnabled())
+                               log.trace("To agent #" + agentUuid + " in "
+                                               + (System.currentTimeMillis() - begin) + " ms, query '"
+                                               + messageCreator.getQuery() + "', correlationId "
+                                               + messageCreator.getCorrelationId());
+               }
+               return res;
        }
 
        /**
@@ -98,11 +144,6 @@ public class JmsAgentProxy implements SlcAgent {
 
        protected void send(AgentMC messageCreator) {
                jmsTemplate.send(requestDestination, messageCreator);
-               if (log.isTraceEnabled())
-                       log.debug("Sent query '" + messageCreator.getQuery()
-                                       + "' with correlationId "
-                                       + messageCreator.getCorrelationId() + " to agent "
-                                       + agentUuid);
        }
 
        protected Object processResponse(AgentMC messageCreator,
@@ -127,10 +168,6 @@ public class JmsAgentProxy implements SlcAgent {
                        else
                                return null;
                }
-               if (log.isTraceEnabled())
-                       log.debug("Received response for query '" + query
-                                       + "' with correlationId " + correlationId + " from agent "
-                                       + agentUuid);
 
                try {
                        return fromMessage(responseMsg);
@@ -174,10 +211,19 @@ public class JmsAgentProxy implements SlcAgent {
                                msg = session.createTextMessage();
                        else
                                msg = toMessage(body, session);
-                       msg.setStringProperty(JmsAgent.PROPERTY_SLC_AGENT_ID, agentUuid);
+                       msg.setStringProperty(MsgConstants.PROPERTY_SLC_AGENT_ID, agentUuid);
                        msg.setStringProperty(JmsAgent.PROPERTY_QUERY, query);
                        msg.setJMSCorrelationID(correlationId);
                        setArguments(msg);
+                       if (msg instanceof TextMessage) {
+                               TextMessage textMessage = (TextMessage) msg;
+                               if (textMessage.getText() == null) {
+                                       // TODO: remove workaround when upgrading to ActiveMQ 5.3
+                                       // Workaround for
+                                       // https://issues.apache.org/activemq/browse/AMQ-2046
+                                       textMessage.setText("");
+                               }
+                       }
                        return msg;
                }