JMX:从服务器读取属性

时间:2013-04-18 11:15:05

标签: java jmx cq5

我们使用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将是复制代理的名称,例如{{1} }})。每个复制代理都有不同的属性,但与我相关的属性是“QueueBlocked”。

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

id=replication-publish-1

}

抛出的错误如下:

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) {

}

据我所知,我应该创建某种实例,但我真的不知道什么实例以及如何创建它。无论是文档还是代码片段,我都非常感谢我能得到的任何帮助:)

1 个答案:

答案 0 :(得分:4)

解决了它:)

这是我正在使用的代码:

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