]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgent.java
Finalize agents
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.activemq / src / main / java / org / argeo / slc / jms / JmsAgent.java
1 package org.argeo.slc.jms;
2
3 import java.net.InetAddress;
4 import java.net.UnknownHostException;
5 import java.util.UUID;
6
7 import javax.jms.Destination;
8 import javax.jms.JMSException;
9 import javax.jms.Message;
10 import javax.jms.MessageListener;
11
12 import org.apache.commons.logging.Log;
13 import org.apache.commons.logging.LogFactory;
14 import org.argeo.slc.SlcException;
15 import org.argeo.slc.core.runtime.AbstractAgent;
16 import org.argeo.slc.process.SlcExecution;
17 import org.argeo.slc.runtime.SlcAgent;
18 import org.argeo.slc.runtime.SlcAgentDescriptor;
19 import org.springframework.beans.factory.DisposableBean;
20 import org.springframework.beans.factory.InitializingBean;
21 import org.springframework.jms.core.JmsTemplate;
22 import org.springframework.jms.support.converter.MessageConverter;
23
24 /** JMS based implementation of SLC Agent. */
25 public class JmsAgent extends AbstractAgent implements SlcAgent,
26 InitializingBean, DisposableBean, MessageListener {
27 private final static Log log = LogFactory.getLog(JmsAgent.class);
28
29 private final SlcAgentDescriptor agentDescriptor;
30 private JmsTemplate jmsTemplate;
31 private Destination agentRegister;
32 private Destination agentUnregister;
33
34 private MessageConverter messageConverter;
35
36 public JmsAgent() {
37 try {
38 agentDescriptor = new SlcAgentDescriptor();
39 agentDescriptor.setUuid(UUID.randomUUID().toString());
40 agentDescriptor.setHost(InetAddress.getLocalHost().getHostName());
41 } catch (UnknownHostException e) {
42 throw new SlcException("Unable to create agent descriptor.", e);
43 }
44 }
45
46 public void afterPropertiesSet() throws Exception {
47 jmsTemplate.convertAndSend(agentRegister, agentDescriptor);
48 log.info("Agent #" + agentDescriptor.getUuid() + " registered to "
49 + agentRegister);
50 }
51
52 public void destroy() throws Exception {
53 jmsTemplate.convertAndSend(agentUnregister, agentDescriptor);
54 log.info("Agent #" + agentDescriptor.getUuid() + " unregistered from "
55 + agentUnregister);
56 }
57
58 public void setJmsTemplate(JmsTemplate jmsTemplate) {
59 this.jmsTemplate = jmsTemplate;
60 }
61
62 public void setAgentRegister(Destination agentRegister) {
63 this.agentRegister = agentRegister;
64 }
65
66 public void setAgentUnregister(Destination agentUnregister) {
67 this.agentUnregister = agentUnregister;
68 }
69
70 public void onMessage(Message message) {
71 // FIXME: we filter the messages on the client side,
72 // because of a weird problem with selector since moving to OSGi
73 try {
74 if (message.getStringProperty("slc-agentId").equals(
75 agentDescriptor.getUuid())) {
76 runSlcExecution((SlcExecution) messageConverter
77 .fromMessage(message));
78 }
79 } catch (JMSException e) {
80 throw new SlcException("Cannot convert message " + message, e);
81 }
82
83 }
84
85 public String getMessageSelector() {
86 String messageSelector = "slc-agentId=" + agentDescriptor.getUuid()
87 + "";
88 // String messageSelector = "slc-agentId LIKE '%'";
89 if (log.isDebugEnabled())
90 log.debug("Message selector: '" + messageSelector + "'");
91 return messageSelector;
92 }
93
94 public void setMessageConverter(MessageConverter messageConverter) {
95 this.messageConverter = messageConverter;
96 }
97
98
99 }