JMX: атрибут чтения с сервера


Мы используем Adobe CQ (5.5) в качестве CMS. Теперь наша среда CQ состоит из одного сервера авторов, где пользователи могут создавать контент, и 2 серверов публикации, которые обслуживают контент в интернете.

Теперь есть агент репликации, который отправляет содержимое с сервера автора на оба сервера публикации. К сожалению, некоторые статьи блокируют очередь агентов репликации, поэтому новый контент больше не публикуется. Это не большая проблема, так как ее легко исправить. Настоящая проблема в том, что мы не замечаем этой блокировки, пока пользователи не начинают жаловаться, что больше не публикуются никакие изменения.

Я поискал вокруг и обнаружил, что CQ предоставляет API JMX, где приложения мониторинга могут присоединяться к нему. Затем я попытался найти какое-нибудь программное обеспечение с открытым исходным кодом, которое позволило бы мне настроить оповещения, чтобы мы могли реагировать быстрее, но я не смог найти что-то.

Именно тогда я решил, что могу попробовать написать свое собственное Java-приложение, которое просто читает атрибут и отправляет почта, если атрибут должен быть истинным. Наверное, это было сложнее, чем я думал.

Во-первых, я не являюсь разработчиком Java, но поскольку CQ основан на Java, я думаю, что попробую. Я прочитал некоторую документацию о JMX и Java и смог получить рабочее соединение с сервером CQ. Но это почти все, что я мог понять.

Мне удалось выяснить, что класс com.adobe.granite.replication имеет тип agent, который хранит идентификатор для каждого агента репликации (идентификатор будет именем агент репликации, например 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
Из того, что я понимаю, я должен создать какой-то экземпляр, но я действительно не имею представления, какой экземпляр и как его создать. Я был бы очень признателен за любую помощь, которую я могу получить. неважно, является ли это документацией или фрагментом кода:)
1 2
jmx

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