2013-04-18 3 views
2

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

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

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

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

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

мне удалось выяснить, что класс com.adobe.granite.replication имеет тип agent который хранит идентификатор для каждого агента репликации (идентификатор будет имя агента репликации, например 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

Смежные вопросы