2010-03-17 7 views

Répondre

5

Vous pouvez utiliser JMX pour purger la file d'attente, à partir de Java ou de WLST (Python). Vous pouvez trouver les définitions MBean pour WLS 10.0 sur http://download.oracle.com/docs/cd/E11035_01/wls100/wlsmbeanref/core/index.html. Voici un exemple Java de base (ne pas oublier de mettre weblogic.jar dans le 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(); 
     } 
    } 
} 
3

fonctionne très bien sur un seul environnement de nœud, mais ce qui se passe si vous êtes sur un environnement en cluster avec ONE lixiviable JMSServer (actuellement sur le noeud n ° 1) et ce code s'exécute sur le noeud n ° 2. Ensuite, il n'y aura pas de JMSServer disponible et aucun message ne sera supprimé.

C'est le problème que je suis face à ce moment ...

Est-il possible de se connecter au JMSQueue sans avoir le JmsServer disponible?

[modifier]
trouvé une solution: Utiliser le service d'exécution de domaine à la place:

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

et assurez-vous d'accéder au port d'administration sur le WLS-cluster.

4

Voici un exemple dans WLST pour un serveur géré en cours d'exécution sur le port 7005:

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

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

cmo.deleteMessages('') 

La dernière commande doit renvoyer le nombre de messages qu'il supprimé.

+0

J'ai essayé ceci mais j'ai obtenu cette exception: 'java.lang.UnsupportedOperationException: deleteMessages (String) non valide pour la classe weblogic.jms.backend.BEDestinationRuntimeMBeanImpl' même si' 'ls()' inclut '-rx deleteMessages Integer: String (sélecteur) 'dans les informations qu'il retourne. – pharsicle

+0

Correction pour moi-même! Ma situation a un sujet avec des abonnés durables. J'avais besoin de cd au MBean pour l'abonné et appelez 'deleteMessages ('')' dessus. – pharsicle

0

si cela est une fois, il serait plus facile de faire la via la console ...

Questions connexes