1 package ejava.examples.jmsmechanics;
2
3 import javax.jms.Connection;
4 import javax.jms.ConnectionFactory;
5 import javax.jms.JMSException;
6 import javax.jms.Message;
7 import javax.jms.Queue;
8 import javax.jms.QueueRequestor;
9 import javax.jms.QueueSession;
10 import javax.jms.Session;
11
12 import org.apache.commons.logging.Log;
13 import org.apache.commons.logging.LogFactory;
14 import org.hornetq.api.jms.HornetQJMSClient;
15 import org.hornetq.api.jms.management.JMSManagementHelper;
16
17
18
19
20
21 public class JMSAdminHornetQ implements JMSAdmin {
22 private static final Log log = LogFactory.getLog(JMSAdminHornetQ.class);
23 private Connection connection;
24 private Queue managementQueue;
25 private String jndiPrefix;
26
27 public JMSAdminHornetQ(ConnectionFactory connFactory, String adminUser, String adminPassword) throws JMSException {
28 connection = connFactory.createConnection(adminUser, adminPassword);
29 connection.start();
30 managementQueue = HornetQJMSClient.createQueue("hornetq.management");
31 }
32
33 @Override
34 public JMSAdmin setJNDIPrefix(String prefix) {
35 this.jndiPrefix = prefix;
36 return this;
37 }
38
39 @Override
40 public void close() throws JMSException {
41 if (connection != null) {
42 connection.close();
43 }
44 }
45
46
47
48
49
50
51
52
53 private static String concat(String name1, String name2) {
54 if (name1==null) { return name2; }
55 else if (name2==null) { return name1; }
56
57 String name= name1.endsWith("/") || name2.startsWith("/") ?
58 String.format("%s%s", name1, name2) :
59 String.format("%s/%s", name1, name2);
60 name=name.replace("//", "/");
61 return name;
62 }
63
64 public JMSAdmin deployDestination(String method, String name, String jndiName) throws Exception {
65 Session session=null;
66 QueueRequestor requestor = null;
67 try {
68 session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
69 requestor=new QueueRequestor((QueueSession) session, managementQueue);
70 Message message = session.createMessage();
71 jndiName = concat(jndiPrefix, jndiName);
72 JMSManagementHelper.putOperationInvocation(message, "jms.server", method, name, jndiName);
73 log.debug(String.format("%s: %s, jndi=%s", method, name, jndiName));
74 Message reply = requestor.request(message);
75 if (!JMSManagementHelper.hasOperationSucceeded(reply)) {
76 throw new RuntimeException("failed to create desintation:" + name);
77 }
78 } finally {
79 if (requestor != null) { requestor.close(); }
80 if (session != null) { session.close(); }
81 }
82
83 return this;
84 }
85
86 public JMSAdmin destroyDestination(String method, String name) throws Exception {
87 Session session=null;
88 QueueRequestor requestor = null;
89 try {
90 session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
91 requestor=new QueueRequestor((QueueSession) session, managementQueue);
92 Message message = session.createMessage();
93 JMSManagementHelper.putOperationInvocation(message, "jms.server", method, name);
94 Message reply = requestor.request(message);
95 if (!JMSManagementHelper.hasOperationSucceeded(reply)) {
96 log.info("failed to destroy desintation:" + name);
97 }
98 } finally {
99 if (requestor != null) { requestor.close(); }
100 if (session != null) { session.close(); }
101 }
102
103 return this;
104 }
105
106 @Override
107 public JMSAdmin deployTopic(String name, String jndiName) throws Exception {
108 return deployDestination("createTopic", name, jndiName);
109 }
110
111 @Override
112 public JMSAdmin deployQueue(String name, String jndiName) throws Exception {
113 return deployDestination("createQueue", name, jndiName);
114 }
115
116 @Override
117 public JMSAdmin destroyTopic(String name) throws Exception {
118 return destroyDestination("destroyTopic", name);
119 }
120
121 @Override
122 public JMSAdmin destroyQueue(String name) throws Exception {
123 return destroyDestination("destroyQueue", name);
124 }
125 }