1 package org
.argeo
.slc
.jms
;
3 import java
.net
.InetAddress
;
4 import java
.net
.UnknownHostException
;
7 import javax
.jms
.Destination
;
8 import javax
.jms
.JMSException
;
9 import javax
.jms
.Message
;
10 import javax
.jms
.MessageListener
;
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
;
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);
29 private final SlcAgentDescriptor agentDescriptor
;
30 private JmsTemplate jmsTemplate
;
31 private Destination agentRegister
;
32 private Destination agentUnregister
;
34 private MessageConverter messageConverter
;
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
);
46 public void afterPropertiesSet() throws Exception
{
47 jmsTemplate
.convertAndSend(agentRegister
, agentDescriptor
);
48 log
.info("Agent #" + agentDescriptor
.getUuid() + " registered to "
52 public void destroy() throws Exception
{
53 jmsTemplate
.convertAndSend(agentUnregister
, agentDescriptor
);
54 log
.info("Agent #" + agentDescriptor
.getUuid() + " unregistered from "
58 public void setJmsTemplate(JmsTemplate jmsTemplate
) {
59 this.jmsTemplate
= jmsTemplate
;
62 public void setAgentRegister(Destination agentRegister
) {
63 this.agentRegister
= agentRegister
;
66 public void setAgentUnregister(Destination agentUnregister
) {
67 this.agentUnregister
= agentUnregister
;
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
74 if (message
.getStringProperty("slc-agentId").equals(
75 agentDescriptor
.getUuid())) {
76 runSlcExecution((SlcExecution
) messageConverter
77 .fromMessage(message
));
79 } catch (JMSException e
) {
80 throw new SlcException("Cannot convert message " + message
, e
);
85 public String
getMessageSelector() {
86 String messageSelector
= "slc-agentId=" + agentDescriptor
.getUuid()
88 // String messageSelector = "slc-agentId LIKE '%'";
89 if (log
.isDebugEnabled())
90 log
.debug("Message selector: '" + messageSelector
+ "'");
91 return messageSelector
;
94 public void setMessageConverter(MessageConverter messageConverter
) {
95 this.messageConverter
= messageConverter
;