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