Bonjour à tous,

J'utilise Active MQ 5.5.1 et Tomcat 7 et je souhaiterais purger une queue (persistante) depuis tomcat. J'utilise un credential afin de sécuriser la connection à ActiveMQ

Voici le code que j'utilise mais qui ne fonctionne pas :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
	private static MBeanServerConnection connect() {
		JMXConnector connector = null;
		MBeanServerConnection connection = null;
 
		try {
 
			Map<String,String[]> env = new HashMap<String,String[]>();
			String[] credentials = new String[] { "mon_role", "mon_mdp" };
			env.put(JMXConnector.CREDENTIALS, credentials);
			connector = JMXConnectorFactory.newJMXConnector(new JMXServiceURL(Configuration.getProperty("activemq.jmxrmiURL")), env);
			connector.connect();
			connection = connector.getMBeanServerConnection();
 
		} catch (Exception e) {
			logger.log(Level.INFO, e.getMessage());
		}
		return connection;
	}
 
 
	private static void purgeQueue(String queueName) {
		ObjectName brokerObjName;
		try {
			MBeanServerConnection connection = connect();
			long start = System.currentTimeMillis();
			brokerObjName = assertRegisteredObjectName("org.apache.activemq:Type=Queue,Destination=" + queueName + ",BrokerName=localhost", connection);
			QueueViewMBean proxy = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(connection, brokerObjName, QueueViewMBean.class, true);
			logger.log(Level.INFO, "[Queue Purge] Begin Queue " + queueName + " of " + proxy.getQueueSize() + " items purge ... / Memory : " + proxy.getMemoryPercentUsage());
			proxy.purge();
			logger.log(Level.INFO, "[Queue Purge] Queue " + queueName + " after : " + proxy.getQueueSize() + " / purge end in " +  (System.currentTimeMillis() - start) + " ms ! Now memory : " + proxy.getMemoryPercentUsage());
		} catch (Exception e) {
			logger.log(Level.INFO, e.getMessage());
		}
	}
 
 
	private static ObjectName assertRegisteredObjectName(String name, MBeanServerConnection connection) throws MalformedObjectNameException, NullPointerException, IOException {
        ObjectName objectName = new ObjectName(name);
        if (!connection.isRegistered(objectName)) {
        	logger.log(Level.INFO, "[JMX Bean Registration] Could not find MBean " + objectName + " - Purge cannot work !");
        }
        return objectName;
	}
Pour information, j'arrive bien à me connecter à JMX et à supprimer des topics avec la méthode Connect() puis celle ci dessous, donc je ne pense pas qu'il s'agisse d'un problème de connection à JMX.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
	private static void removeTopic(MBeanServerConnection conn, String topicName) {
		Object[] params = {topicName};
		String[] sig = {"java.lang.String"};
 
		ObjectName brokerObjName;
		try {
			brokerObjName = new ObjectName("org.apache.activemq:BrokerName=localhost,Type=Broker");
			conn.invoke(brokerObjName, "removeTopic", params, sig); 
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
Voici la trace que j'ai lors de la tentative de purge de la queue :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
        private static String dashBoardQueueName = "dashboard";
	public void purgeDashBoardQueue() {
		purgeQueue(dashBoardQueueName);
	}
 
INFO [Queue Purge] Begin Queue dashboard of 0 items purge ... / Memory : 0
INFO [Queue Purge] Queue dashboard after : 0 / purge end in 2 ms ! Now memory : 0
Donc j'ai l'impression qu'il se connecte bien au Bean de JMX mais qu'il n'arrive déjà pas à récupérer la bonne taille de ma queue (elle n'est pas vide).

Avez-vous déjà utilisé cette méthode pour purger une queue ? Si oui, avez-vous une idée de mon problème ?

Merci à tous !!

Cdt,

Guillaume