1 package org
.argeo
.slc
.jms
;
5 import javax
.jms
.ConnectionFactory
;
6 import javax
.jms
.Destination
;
8 import org
.apache
.commons
.logging
.Log
;
9 import org
.apache
.commons
.logging
.LogFactory
;
10 import org
.argeo
.slc
.SlcException
;
11 import org
.argeo
.slc
.msg
.event
.SlcEvent
;
12 import org
.argeo
.slc
.msg
.event
.SlcEventListener
;
13 import org
.argeo
.slc
.msg
.event
.SlcEventListenerDescriptor
;
14 import org
.argeo
.slc
.msg
.event
.SlcEventListenerRegister
;
15 import org
.springframework
.jms
.core
.JmsTemplate
;
16 import org
.springframework
.jms
.support
.converter
.MessageConverter
;
18 public class JmsSlcEventListener
implements SlcEventListener
{
19 private final static Log log
= LogFactory
.getLog(JmsSlcEventListener
.class);
21 private Destination eventsDestination
;
22 private ConnectionFactory jmsConnectionFactory
;
23 private MessageConverter messageConverter
;
25 public SlcEvent
listen(SlcEventListenerRegister register
, Long timeout
) {
26 JmsTemplate jmsTemplate
= new JmsTemplate(jmsConnectionFactory
);
27 jmsTemplate
.setMessageConverter(messageConverter
);
28 jmsTemplate
.setReceiveTimeout(timeout
);
30 List
<SlcEventListenerDescriptor
> descriptors
= register
31 .getDescriptorsCopy();
33 if (descriptors
.size() == 0) {
34 // No listeners, just waiting
36 Thread
.sleep(timeout
);
37 } catch (InterruptedException e
) {
42 String selector
= createSelector(descriptors
);
44 if (log
.isTraceEnabled())
45 log
.debug("Selector: " + selector
);
47 Object obj
= jmsTemplate
.receiveSelectedAndConvert(
48 eventsDestination
, selector
);
53 return (SlcEvent
) obj
;
57 /** Returns null if no filter */
58 protected String
createSelector(List
<SlcEventListenerDescriptor
> descriptors
) {
59 if (descriptors
.size() == 0)
60 throw new SlcException("No listeners, cannot generate JMS selector");
62 StringBuffer buf
= new StringBuffer(256);
64 for (SlcEventListenerDescriptor descriptor
: descriptors
) {
71 buf
.append(SlcEvent
.EVENT_TYPE
).append("=").append('\'').append(
72 descriptor
.getEventType()).append('\'');
73 if (descriptor
.getFilter() != null) {
75 buf
.append('(').append(descriptor
.getFilter()).append(')');
79 return buf
.toString();
82 public void setEventsDestination(Destination eventsDestination
) {
83 this.eventsDestination
= eventsDestination
;
86 public void setJmsConnectionFactory(ConnectionFactory jmsConnectionFactory
) {
87 this.jmsConnectionFactory
= jmsConnectionFactory
;
90 public void setMessageConverter(MessageConverter messageConverter
) {
91 this.messageConverter
= messageConverter
;