1 package org
.argeo
.slc
.jms
;
3 import java
.net
.InetAddress
;
4 import java
.net
.UnknownHostException
;
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
;
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
;
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);
30 private final SlcAgentDescriptor agentDescriptor
;
31 private ConnectionFactory connectionFactory
;
32 private JmsTemplate jmsTemplate
;
33 private Destination agentRegister
;
34 private Destination agentUnregister
;
36 private MessageConverter messageConverter
;
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
);
48 public void afterPropertiesSet() throws Exception
{
49 // Initialize JMS Template
50 jmsTemplate
= new JmsTemplate(connectionFactory
);
51 jmsTemplate
.setMessageConverter(messageConverter
);
53 jmsTemplate
.convertAndSend(agentRegister
, agentDescriptor
);
54 log
.info("Agent #" + agentDescriptor
.getUuid() + " registered to "
58 public void destroy() throws Exception
{
59 jmsTemplate
.convertAndSend(agentUnregister
, agentDescriptor
);
60 log
.info("Agent #" + agentDescriptor
.getUuid() + " unregistered from "
64 public void setAgentRegister(Destination agentRegister
) {
65 this.agentRegister
= agentRegister
;
68 public void setAgentUnregister(Destination agentUnregister
) {
69 this.agentUnregister
= agentUnregister
;
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
76 if (message
.getStringProperty("slc-agentId").equals(
77 agentDescriptor
.getUuid())) {
78 runSlcExecution((SlcExecution
) messageConverter
79 .fromMessage(message
));
81 } catch (JMSException e
) {
82 throw new SlcException("Cannot convert message " + message
, e
);
87 public String
getMessageSelector() {
88 String messageSelector
= "slc-agentId=" + agentDescriptor
.getUuid()
90 // String messageSelector = "slc-agentId LIKE '%'";
91 if (log
.isDebugEnabled())
92 log
.debug("Message selector: '" + messageSelector
+ "'");
93 return messageSelector
;
96 public void setMessageConverter(MessageConverter messageConverter
) {
97 this.messageConverter
= messageConverter
;
100 public void setConnectionFactory(ConnectionFactory connectionFactory
) {
101 this.connectionFactory
= connectionFactory
;