我們使用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
從什麼我知道我應該創建某種實例,但我真的不知道實例以及如何創建它。我真的很感謝所有幫助我能不管它是否是一個文件或代碼片段:)
尼斯,我正在尋找這樣的東西。我在此基礎上構建了一些,並檢索給定ObjectName的所有屬性名稱。 MBeanInfo beanInfo = mbsc.getMBeanInfo(mxBeanName);然後MBeanAttributeInfo [] attrs = beanInfo.getAttributes(); –
@george_h很高興幫助:) – Ahatius