How to clear / delete message from JMS queue weblogic

There is and not (other than consuming the message), I can clear / delete the message programmatically from the JMS queue. Even if it is possible using the wlst command line tool, this will be of great help.

+6
source share
5 answers

You can use JMX to clear the queue, either from Java or from WLST (Python). You can find the MBean definitions for WLS 10.0 at http://download.oracle.com/docs/cd/E11035_01/wls100/wlsmbeanref/core/index.html . Here is an example of basic Java (don't forget to put weblogic.jar in CLASSPATH):

import java.util.Hashtable; import javax.management.MBeanServerConnection; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import javax.management.ObjectName; import javax.naming.Context; import weblogic.management.mbeanservers.runtime.RuntimeServiceMBean; public class PurgeWLSQueue { private static final String WLS_USERNAME = "weblogic"; private static final String WLS_PASSWORD = "weblogic"; private static final String WLS_HOST = "localhost"; private static final int WLS_PORT = 7001; private static final String JMS_SERVER = "wlsbJMSServer"; private static final String JMS_DESTINATION = "test.q"; private static JMXConnector getMBeanServerConnector(String jndiName) throws Exception { Hashtable<String,String> h = new Hashtable<String,String>(); JMXServiceURL serviceURL = new JMXServiceURL("t3", WLS_HOST, WLS_PORT, jndiName); h.put(Context.SECURITY_PRINCIPAL, WLS_USERNAME); h.put(Context.SECURITY_CREDENTIALS, WLS_PASSWORD); h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote"); JMXConnector connector = JMXConnectorFactory.connect(serviceURL, h); return connector; } public static void main(String[] args) { try { JMXConnector connector = getMBeanServerConnector("/jndi/"+RuntimeServiceMBean.MBEANSERVER_JNDI_NAME); MBeanServerConnection mbeanServerConnection = connector.getMBeanServerConnection(); ObjectName service = new ObjectName("com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean"); ObjectName serverRuntime = (ObjectName) mbeanServerConnection.getAttribute(service, "ServerRuntime"); ObjectName jmsRuntime = (ObjectName) mbeanServerConnection.getAttribute(serverRuntime, "JMSRuntime"); ObjectName[] jmsServers = (ObjectName[]) mbeanServerConnection.getAttribute(jmsRuntime, "JMSServers"); for (ObjectName jmsServer: jmsServers) { if (JMS_SERVER.equals(jmsServer.getKeyProperty("Name"))) { ObjectName[] destinations = (ObjectName[]) mbeanServerConnection.getAttribute(jmsServer, "Destinations"); for (ObjectName destination: destinations) { if (destination.getKeyProperty("Name").endsWith("!"+JMS_DESTINATION)) { Object o = mbeanServerConnection.invoke( destination, "deleteMessages", new Object[] {""}, // selector expression new String[] {"java.lang.String"}); System.out.println("Result: "+o); break; } } break; } } connector.close(); } catch (Exception e) { e.printStackTrace(); } } } 
+5
source share

Here is an example in WLST for a managed server running on port 7005:

 connect('weblogic', 'weblogic', 't3://localhost:7005') serverRuntime() cd('/JMSRuntime/ManagedSrv1.jms/JMSServers/MyAppJMSServer/Destinations/MyAppJMSModule!QueueNameToClear') cmo.deleteMessages('') 

The last command should return the number of deleted messages.

+4
source share

Works fine in a single node environment, but what happens if you are in a cluster environment with ONE migratable JMSServer (currently on node # 1) and this code runs on node # 2. Then there will be no JMSServer available and no message will be deleted.

This is the problem I'm facing right now ...

Is there a way to connect to a JMSQueue without having a JMSServer?

[edit]
Solution found: use the runtime service instead:

 ObjectName service = new ObjectName("com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean"); 

and be sure to access the admin port on the WLS cluster.

+3
source share

If this is one time, the easiest way to do this is through the console ...

0
source share

The program in the link below allows you to clear only pending messages from the queue based on the parameter of the resent message

http://techytalks.blogspot.in/2016/02/deletepurge-pending-messages-from-jms.html

0
source share

All Articles