2011-10-06 6 views
2

구성 : 2 개의 노드 # 1 및 # 2가있는 WLS 클러스터 (10.3). 하나의 마이그레이션 가능한 JMSServer가 현재 # 1에서 사용 가능합니다. 하나의 마이그레이션 가능한 JMSQueue.클러스터 환경에서 JMX를 통해 JMSQueue에 액세스

문제점 : 일부 EJB는 timeToDeliever를 60 초로 설정하여 메시지로 JSMQueue를 채우고 있습니다. (60 초 안에 보이지 않음), 다른 EJB는 JMX를 사용하여 보이지 않게하기 전에 메시지를 볼 것입니다. 이 다른 EJB가 # 2에서 실행되면 JMSServer를 찾을 수 없으므로 메시지를 팝하지 않습니다. 코드가 아닌 클러스터 환경에서 잘 작동합니다



    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 h = new Hashtable(); 
      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(); 
      } 
     } 
    } 

점점에 어떤 다른 방법이 있습니까 (이 코드는이 포럼에 미클로스 Csuka에서 차용)

그 즉, JMSServer를 지정하지 않고 메시지를 직접 I 수 JMSQueue를 처리 하시겠습니까? 다른 아이디어?

답변

0

아, 해결했습니다! 같은 문제에 직면 다른 사람을 위해
대신 도메인 런타임 서비스 사용

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

을하고 WLS-클러스터에 관리 포트에 액세스해야합니다.