2010-03-17 2 views

Antwort

5

Sie können JMX zum Löschen der Warteschlange verwenden, entweder von Java oder von WLST (Python). Sie finden die MBean-Definitionen für WLS 10.0 unter http://download.oracle.com/docs/cd/E11035_01/wls100/wlsmbeanref/core/index.html. Hier ist ein einfaches Java-Beispiel (vergessen Sie nicht weblogic.jar im CLASSPATH zu setzen):

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(); 
     } 
    } 
} 
3

Funktioniert hervorragend auf einer einzelnen Knoten Umgebung, aber was passiert, wenn man auf einer Cluster-Umgebung mit ONE migrierfähige ist JMSServer (derzeit auf Knoten # 1) und dieser Code wird auf Knoten # 2 ausgeführt. Dann ist kein JMS-Server verfügbar und keine Nachricht wird gelöscht.

Das ist das Problem, das ich jetzt mit Blick auf bin ...

Gibt es eine Möglichkeit zum JMSQueue zu verbinden, ohne die JmsServer zur Verfügung zu haben?

[Bearbeiten]
eine Lösung gefunden: Verwenden Sie den Domain-Laufzeitdienst statt:

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

und sicher sein, den Admin Port auf dem WLS-Cluster zuzugreifen. Hier

4

ist ein Beispiel in WLST für einen Managed Server auf Port 7005:

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

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

cmo.deleteMessages('') 

Der letzte Befehl sollte die Anzahl der Nachrichten zurückgeben gelöscht.

+0

habe ich versucht, diese aber habe diese Ausnahme: 'java.lang.UnsupportedOperationException: DeleteMessages (String) für die Klasse nicht gültig weblogic.jms.backend.BEDestinationRuntimeMBeanImpl' obwohl' ls() '' enthält -rx DeleteMessages Integer: String (Selektor) 'in der Information, die es zurückgibt. – pharsicle

+0

Behoben für mich selbst! Meine Situation hat ein Thema mit dauerhaften Abonnenten. Ich musste zu dem MBean für den Abonnenten wechseln und 'deleteMessages ('') 'darauf aufrufen. – pharsicle

0

wenn dieses ein Mal ist, wäre die einfachste es über die Konsole zu tun ...