View Javadoc
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   * This class implements a client to dynamically create JMS resources on the
19   * server.
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  	 * Concatenates two JNDI names making sure there is a single "/" character
48  	 * separating them
49  	 * @param name1
50  	 * @param name2
51  	 * @return
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 }