2013-04-18 77 views
2

我們使用Adobe CQ(5.5)作爲CMS。現在,我們的CQ環境由一個作者服務器組成,用戶可以在其中創建內容,以及2個發佈服務器將內容提供給互聯網。JMX:從服務器讀取屬性

現在有一個複製代理將內容從作者服務器推送到兩個發佈服務器。不幸的是,有些文章阻止了複製代理隊列,所以沒有更多的新內容正在發佈。這不是什麼大問題,因爲它很容易修復。真正的問題是,我們沒有注意到這種阻塞,直到用戶開始抱怨沒有更多的變化正在發佈。

我搜索了一遍,發現CQ提供了一個JMX API,監視應用程序可以將它附加到它。然後我試圖找到一些開放源代碼軟件,它可以讓我配置警報,所以我們可以更快地做出反應,但是我找不到任何東西。

這是當我決定我可以嘗試編寫自己的Java應用程序,它只讀取屬性併發送郵件,如果屬性應該爲true。我想這比我想象的要複雜得多。

首先,我不是Java開發人員,但由於CQ基於Java,所以我試過了。我閱讀了一些關於JMX和Java的文檔,並且能夠連接到CQ服務器。但這幾乎是我可以實現的一切。

我能夠發現類com.adobe.granite.replication有一個類型agent,它爲每個複製代理存儲一個id(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