1
2
3
4
5
6
7 package org.mule.transport.jms.activemq;
8
9 import org.mule.api.MuleContext;
10 import org.mule.transport.ConnectException;
11 import org.mule.transport.jms.JmsConnector;
12 import org.mule.transport.jms.xa.TargetInvocationHandler;
13 import org.mule.util.ClassUtils;
14
15 import java.lang.reflect.InvocationTargetException;
16 import java.lang.reflect.Method;
17 import java.lang.reflect.Proxy;
18
19 import javax.jms.Connection;
20 import javax.jms.ConnectionFactory;
21 import javax.jms.JMSException;
22
23
24
25
26 public class ActiveMQJmsConnector extends JmsConnector
27 {
28 public static final String ACTIVEMQ_CONNECTION_FACTORY_CLASS = "org.apache.activemq.ActiveMQConnectionFactory";
29 public static final String DEFAULT_BROKER_URL = "vm://localhost?broker.persistent=false&broker.useJmx=false";
30
31 private String brokerURL = DEFAULT_BROKER_URL;
32
33
34
35
36 public ActiveMQJmsConnector(MuleContext context)
37 {
38 super(context);
39 setEagerConsumer(false);
40
41 }
42
43 protected ConnectionFactory getDefaultConnectionFactory() throws Exception
44 {
45 ConnectionFactory connectionFactory = (ConnectionFactory)
46 ClassUtils.instanciateClass(ACTIVEMQ_CONNECTION_FACTORY_CLASS, getBrokerURL());
47 applyVendorSpecificConnectionFactoryProperties(connectionFactory);
48 return connectionFactory;
49 }
50
51 protected void applyVendorSpecificConnectionFactoryProperties(ConnectionFactory connectionFactory)
52 {
53 try
54 {
55 Method getRedeliveryPolicyMethod = connectionFactory.getClass().getMethod("getRedeliveryPolicy");
56 Object redeliveryPolicy = getRedeliveryPolicyMethod.invoke(connectionFactory);
57 Method setMaximumRedeliveriesMethod = redeliveryPolicy.getClass().getMethod("setMaximumRedeliveries", Integer.TYPE);
58 int maxRedelivery = getMaxRedelivery();
59 if (maxRedelivery != REDELIVERY_IGNORE )
60 {
61
62 maxRedelivery++;
63 }
64 setMaximumRedeliveriesMethod.invoke(redeliveryPolicy, maxRedelivery);
65 }
66 catch (Exception e)
67 {
68 logger.error("Can not set MaxRedelivery parameter to RedeliveryPolicy " + e);
69 }
70 }
71
72
73
74
75 protected void doDisconnect() throws Exception
76 {
77 try
78 {
79 Connection connection = getConnection();
80 if (connection == null)
81 {
82 return;
83 }
84
85 final Class clazz = connection.getClass();
86 Method cleanupMethod;
87 if (Proxy.isProxyClass(clazz))
88 {
89 TargetInvocationHandler handler =
90 (TargetInvocationHandler) Proxy.getInvocationHandler(connection);
91
92
93
94
95 connection = (Connection) handler.getTargetObject();
96 Class realConnectionClass = connection.getClass();
97 cleanupMethod = realConnectionClass.getMethod("cleanup", (Class[])null);
98 }
99 else
100 {
101 cleanupMethod = clazz.getMethod("cleanup", (Class[])null);
102 }
103
104 try
105 {
106 if (cleanupMethod != null)
107 {
108 cleanupMethod.invoke(connection, (Object[])null);
109 }
110 }
111 catch (InvocationTargetException ex)
112 {
113 logger.warn("Exception cleaning up JMS connection: " + ex.getMessage());
114 }
115 finally
116 {
117 try
118 {
119 connection.close();
120 }
121 catch (JMSException ex)
122 {
123 logger.warn("Exception closing JMS connection: " + ex.getMessage());
124 }
125 }
126 }
127 catch (Exception e)
128 {
129 throw new ConnectException(e, this);
130 }
131 finally
132 {
133
134 setConnection(null);
135 }
136 }
137
138 public String getBrokerURL()
139 {
140 return brokerURL;
141 }
142
143 public void setBrokerURL(String brokerURL)
144 {
145 this.brokerURL = brokerURL;
146 }
147 }