Как очистить/удалить сообщение из очереди weblogic JMS

Есть ли способ (кроме потребления сообщения) я могу программно очистить/удалить сообщение из очереди JMS. Даже если это возможно с помощью инструмента командной строки wlst, это очень поможет.


person Sumanta Basu    schedule 17.03.2010    source источник


Ответы (5)


Вот пример в WLST для управляемого сервера, работающего на порту 7005:

connect('weblogic', 'weblogic', 't3://localhost:7005')
serverRuntime()

cd('/JMSRuntime/ManagedSrv1.jms/JMSServers/MyAppJMSServer/Destinations/MyAppJMSModule!QueueNameToClear')

cmo.deleteMessages('')

Последняя команда должна вернуть количество удаленных сообщений.

person Eric Darchis    schedule 15.11.2011
comment
Я попробовал это, но получил это исключение: java.lang.UnsupportedOperationException: deleteMessages(String) not valid for class weblogic.jms.backend.BEDestinationRuntimeMBeanImpl, хотя ls() включает -r-x deleteMessages Integer : String(selector) в возвращаемую информацию. - person pharsicle; 01.05.2013
comment
Исправил для себя! Моя ситуация имеет тему с устойчивыми подписчиками. Мне нужно было подключиться к MBean для подписчика и вызвать на нем deleteMessages(''). - person pharsicle; 01.05.2013

Вы можете использовать JMX для очистки очереди либо из Java, либо из WLST (Python). Вы можете найти определения MBean для WLS 10.0 на http://download.oracle.com/docs/cd/E11035_01/wls100/wlsmbeanref/core/index.html. Вот базовый пример Java (не забудьте поместить weblogic.jar в 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();
        }
    }
}
person Miklos Csuka    schedule 17.03.2010

Отлично работает в среде с одним узлом, но что произойдет, если вы находитесь в кластерной среде с ОДНИМ переносимым JMSServer (в настоящее время на узле № 1), а этот код выполняется на узле № 2. Тогда JMSServer будет недоступен, и никакое сообщение не будет удалено.

Это проблема, с которой я сейчас сталкиваюсь...

Есть ли способ подключиться к JMSQueue без доступа к JMSServer?

[править]
Найдено решение: вместо этого используйте службу времени выполнения домена:

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

и обязательно получите доступ к порту admin в WLS-кластере.

person Herman    schedule 06.10.2011

если это один раз, то проще всего сделать это через консоль...

person Yogesh_D    schedule 07.02.2013

программа по ссылке ниже поможет вам очистить только ожидающие сообщения из очереди на основе параметра повторно доставленного сообщения

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

person user5949756    schedule 19.02.2016
comment
Так как это ваш первый ответ. таким образом, я ничего не говорю, но постарайтесь избегать внешних ссылок и проявите некоторые усилия с вашей стороны. - person surajs1n; 19.02.2016