1
2
3
4
5
6
7
8
9
10
11 package org.mule.transport.jms;
12
13 import org.mule.config.i18n.CoreMessages;
14
15 import java.util.Enumeration;
16 import java.util.concurrent.atomic.AtomicReference;
17
18 import javax.jms.ConnectionMetaData;
19 import javax.jms.JMSException;
20
21 import org.apache.commons.logging.Log;
22 import org.apache.commons.logging.LogFactory;
23
24
25
26
27
28
29
30
31
32 public class AutoDiscoveryRedeliveryHandlerFactory implements RedeliveryHandlerFactory
33 {
34 protected final Log logger = LogFactory.getLog(getClass());
35
36 protected AtomicReference<RedeliveryHandler> delegateHandler = new AtomicReference<RedeliveryHandler>(null);
37
38 protected JmsConnector connector;
39
40 public AutoDiscoveryRedeliveryHandlerFactory(JmsConnector connector)
41 {
42 if (connector == null)
43 {
44 throw new IllegalArgumentException(CoreMessages.objectIsNull("connector").getMessage());
45 }
46 this.connector = connector;
47 }
48
49 public RedeliveryHandler create()
50 {
51 RedeliveryHandler result;
52
53
54 if (delegateHandler.get() == null)
55 {
56 RedeliveryHandler newInstance = createInstance();
57 boolean ok = delegateHandler.compareAndSet(null, newInstance);
58 if (!ok)
59 {
60
61 result = delegateHandler.get();
62 }
63 else
64 {
65 result = newInstance;
66 }
67 }
68 else
69 {
70
71 result = delegateHandler.get();
72 }
73
74 return result;
75 }
76
77
78
79
80
81
82 protected RedeliveryHandler createInstance()
83 {
84 RedeliveryHandler newInstance;
85 try
86 {
87 ConnectionMetaData metaData = connector.getConnection().getMetaData();
88 boolean supportsDeliveryCount = false;
89 final Enumeration propNames = metaData.getJMSXPropertyNames();
90 while (propNames.hasMoreElements())
91 {
92 String p = (String) propNames.nextElement();
93 if (JmsConstants.JMS_X_DELIVERY_COUNT.equals(p))
94 {
95 supportsDeliveryCount = true;
96 break;
97 }
98 }
99
100 newInstance = (supportsDeliveryCount) ? new JmsXRedeliveryHandler() : new CountingRedeliveryHandler();
101 }
102 catch (JMSException e)
103 {
104
105 newInstance = new CountingRedeliveryHandler();
106 }
107
108 if (logger.isDebugEnabled())
109 {
110 logger.debug("Using " + newInstance.getClass().getName());
111 }
112
113 return newInstance;
114 }
115
116 }