JMX:从服务器读取属性

我们使用Adobe CQ(5.5)作为CMS。 现在,我们的CQ环境包括一个作者服务器,用户可以在其中创建内容,以及2个发布服务器,用于将内容提供给互联网。

现在有一个复制代理程序将内容从作者服务器推送到两个发布服务器。 不幸的是,有些文章会阻止复制代理的队列,因此不再发布新内容。 这不是什么大问题,因为它很容易修复。 真正的问题是,在用户开始抱怨不再发布更改之前,我们不会注意到这种阻塞。

我四处搜索,发现CQ提供了一个JMX API,监控应用程序可以将其自身附加到它上面。 然后我试图找到一些允许我配置警报的开源软件,这样我们就能更快地做出反应,但我找不到一些东西。

这时我决定编写自己的Java应用程序,它只读取属性并在属性为true时发送邮件。 我想这比我想的要复杂得多。

首先,我不是Java开发人员,但由于CQ是基于Java的,所以我试试看。 我阅读了一些关于JMX和Java的文档,并且能够获得与CQ服务器的有效连接。 但这几乎是我能想到的一切。

我能够发现类com.adobe.granite.replication有一个类型agent ,它为每个复制代理存储一个id(id将是复制代理的名称,例如id=replication-publish-1 ) 。 每个复制代理都有不同的属性,但与我相关的属性是“QueueBlocked”。

这是我到目前为止的代码(它基于这个例子):

 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 

从我的理解,我应该创建一些实例,但我真的不知道什么实例和如何创建它。 无论是文档还是代码片段,我都非常感谢我能得到的任何帮助:)

解决了:)

这是我正在使用的代码:

 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(); } } }