2010-03-17 33 views

Trả lời

5

Bạn có thể sử dụng JMX để xóa hàng đợi, hoặc từ Java hoặc từ WLST (Python). Bạn có thể tìm thấy các định nghĩa MBean cho WLS 10.0 trên http://download.oracle.com/docs/cd/E11035_01/wls100/wlsmbeanref/core/index.html. Dưới đây là một ví dụ Java cơ bản (đừng quên đặt weblogic.jar trong 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

công trình lớn trên một môi trường nút duy nhất, nhưng những gì sẽ xảy ra nếu bạn đang ở trên một môi trường clustered với ONE migratable JMSServer (hiện tại trên nút # 1) và mã này đang thực hiện trên nút # 2. Sau đó sẽ không có JMSServer và không có tin nhắn nào bị xóa.

Đây là vấn đề tôi phải đối mặt ngay bây giờ ...

Có cách nào để kết nối với JMSQueue mà không có JMSServer sẵn?

[sửa]
Tìm thấy một giải pháp: Sử dụng dịch vụ runtime miền thay vì:

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

và chắc chắn để truy cập quản trị cổng trên WLS-cluster.

4

Dưới đây là một ví dụ trong WLST cho một máy chủ quản lý chạy trên cổng 7005:

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

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

cmo.deleteMessages('') 

Lệnh cuối cùng phải trả lại số tin nhắn đã xóa.

+0

Tôi đã thử điều này nhưng có ngoại lệ này: 'java.lang.UnsupportedOperationException: deleteMessages (String) không hợp lệ cho lớp weblogic.jms.backend.BEDestinationRuntimeMBeanImpl' mặc dù' ls() 'bao gồm' -rx deleteMessages Integer: String (selector) 'trong thông tin nó trả về. – pharsicle

+0

Đã sửa lỗi cho chính tôi! Tình hình của tôi có một chủ đề với các thuê bao bền. Tôi cần cd để MBean cho thuê bao và gọi 'deleteMessages ('')' trên đó. – pharsicle

0

nếu điều này là một trong những thời gian, đơn giản nhất sẽ được để làm điều đó thông qua giao diện điều khiển ...

0

chương trình trong liên kết dưới đây sẽ giúp bạn xóa chỉ cấp phát các thông điệp từ hàng đợi dựa trên tham số nhắn redelivered

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

+1

Vì đây là câu trả lời đầu tiên của bạn. do đó, tôi không nói bất cứ điều gì, nhưng cố gắng tránh các liên kết bên ngoài và hiển thị một số nỗ lực từ phía bạn. – surajsn

Các vấn đề liên quan