Gibt es und Weise (abgesehen von der Nachricht konsumieren) Ich kann Nachricht programmgesteuert aus JMS-Warteschlange löschen/löschen. Auch wenn es über das Befehlszeilen-Tool möglich ist, wird es sehr hilfreich sein.Wie lösche/lösche Nachricht von Weblogic JMS-Warteschlange
Antwort
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();
}
}
}
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
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.
wenn dieses ein Mal ist, wäre die einfachste es über die Konsole zu tun ...
das Programm in folgendem Link können Sie nur löschen Nachrichten aus der Warteschlange der Warteschlange basierend auf redelivered Nachrichtenparametern
http://techytalks.blogspot.in/2016/02/deletepurge-pending-messages-from-jms.html
Da dies Ihre erste Antwort ist. also sage ich nichts, aber versuche externe verbindungen zu vermeiden und zeige einige bemühungen von deiner seite. – surajsn
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
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