2013-04-18 2 views
2

우리는 Adobe CQ (5.5)를 CMS로 사용하고 있습니다. 이제 우리의 CQ 환경은 사용자가 컨텐츠를 작성할 수있는 하나의 작성자 서버로 구성되며, 컨텐츠를 인터넷에 제공하는 서버를 게시합니다.JMX : 서버의 속성 읽기

작성자 서버의 콘텐츠를 게시 서버로 푸시하는 복제 에이전트가 있습니다. 아쉽게도 일부 아티클은 복제 에이전트의 대기열을 차단하므로 더 이상 새로운 컨텐트가 게시되지 않습니다. 수정하기 쉽기 때문에 이것은별로 문제가되지 않습니다. 실제 문제는 사용자가 더 이상 변경 사항이 게시되지 않는다고 불평하기 시작할 때까지이 차단을 알 수 없다는 것입니다.

나는 CQ가 모니터링 응용 프로그램을 설치할 수있는 JMX API를 제공한다는 사실을 알아 냈습니다. 그런 다음 알리미를 구성 할 수있는 오픈 소스 소프트웨어를 찾으려고 노력 했으므로 더 빨리 대응할 수 있었지만 뭔가를 찾을 수 없었습니다.

이것은 속성을 true로 설정해야만 메일을 보낼 수있는 자체 자바 애플리케이션을 작성하려고 할 때 결정되었습니다. 나는 그것이 tought보다 복잡 했다을 추측한다.

우선 자바 개발자는 아니지만 CQ는 자바를 기반으로하고 있으므로 꼭 사용해 보도록하겠습니다. JMX와 Java에 대한 몇 가지 문서를 읽고 CQ 서버에 제대로 연결될 수있었습니다. 그러나 이것은 내가 실현할 수있는 거의 모든 것입니다.

클래스 com.adobe.granite.replication에는 모든 복제 에이전트에 대한 ID를 저장하는 agent 유형이 있습니다 (이 ID는 복제 에이전트의 이름입니다 (예 : id=replication-publish-1). 모든 복제 에이전트에는 다른 속성이 있지만 관련 속성은 "QueueBlocked"입니다.

이 (가 this 예를 기반으로) 내가 지금까지 가지고 코드입니다 :

public static void main(String[] args) { 
    try { 
     JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://servername:9010/jmxrmi"); 
     JMXConnector jmxc = JMXConnectorFactory.connect(url, null); 

     ClientListener listener = new ClientListener(); 

     MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); 

     // This outputs the domains, one of them is com.adobee.granite.replication, the one which I need to use 
     // This is why I'm sure that at least the connection works, I don't have any com.adobe.granite.replication class on my Eclipse installation, so the output has to come from the server 
     String domains[] = mbsc.getDomains(); 
     for (int i = 0; i < domains.length; i++) { 
      echo("\tDomain[" + i + "] = " + domains[i]); 
     } 

     ObjectName replication = new ObjectName("com.adobe.granite.replication:type=Agent,id=replication-publish-1"); 

     mbsc.getAttribute(replication, "QueueBlocked"); // This throws the error 
} catch(Exception e) { 

} 

}

발생 된 오류는 다음과 같다 :에서

javax.management.InstanceNotFoundException: com.adobe.granite.replication:type=Agent,id=replication-publish-1 

무엇 나는 어떤 종류의 인스턴스를 만들어야한다는 것을 이해하지만 실제로 어떤 인스턴스와 인스턴스를 생성 하는지를 알지 못합니다. 정말 그것이 문서 또는 코드 조각 :

답변

3

그것을 :) 해결 만약 내가 상관없이 얻을 수있는 모든 도움을 주셔서 감사합니다 것

이 내가 사용하는 코드입니다 :

import java.io.IOException; 
import java.util.Iterator; 
import java.util.Set; 
import javax.management.Attribute; 
import javax.management.MBeanServerConnection; 
import javax.management.MBeanServerInvocationHandler; 
import javax.management.ObjectName; 
import javax.management.remote.JMXConnector; 
import javax.management.remote.JMXConnectorFactory; 
import javax.management.remote.JMXServiceURL; 

public class Client { 

    public static void main(String[] args) { 
     try { 
      JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://servername:9010/jmxrmi"); 
      JMXConnector jmxc = JMXConnectorFactory.connect(url, null); 

      MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); 

      ObjectName replication1 = new ObjectName("com.adobe.granite.replication:type=agent,id=\"replication-publish-1\""); 
      ObjectName replication2 = new ObjectName("com.adobe.granite.replication:type=agent,id=\"replication-publish-2\""); 

      String replication1Status = mbsc.getAttribute(replication1, "QueuePaused").toString(); 
      String replication2Status = mbsc.getAttribute(replication2, "QueuePaused").toString(); 



     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

니스, 나는 이와 같은 것을 찾고있었습니다. 이것에 비트를 구축해, 지정된 ObjectName의 모든 속성 명을 가져옵니다. MBeanInfo beanInfo = mbsc.getMBeanInfo (mxBeanName); 그런 다음 MBeanAttributeInfo [] attrs = beanInfo.getAttributes(); –

+0

@george_h 기꺼이 도와 줬습니다 :) – Ahatius