2016-02-03 1 views
0

Я использую Spring jmx для создания клиента jmx, который может взаимодействовать с кластером Cassandra, чтобы получить атрибут объекта mbean. Livedicsspaceused.Как создать JMX-клиент, который может взаимодействовать с несколькими серверами jmx, используя различные serviceUrl

Таким образом, у этого Cassandra кластера было 3 узла, следовательно, различные службы Url (каждый из которых имел разные IP-адреса).

Теперь я понимаю, что при создании MBeanServerConnectionFactoryBean боба я могу указать только один URL службы, как показано ниже:

@Bean 
MBeanServerConnectionFactoryBean getConnector() { 
    MBeanServerConnectionFactoryBean mBeanfactory = new MBeanServerConnectionFactoryBean(); 
    try { 
     mBeanfactory.setServiceUrl("serviceUrl1"); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } 
    mBeanfactory.setConnectOnStartup(false); 
    return mBeanfactory; 
} 

Тогда в основном я доступ к этому, как показано ниже:

objectName = newObjectName(QueueServicesConstant.MBEAN_OBJ_NAME_LIVE_DISC_USED); 
long count = (Long)mBeanFactory.getObject().getAttribute(objectName, QueueServicesConstant.MBEAN_ATTR_NAME_COUNT); 

Как я могу получить это значение во всех трех узлах?

ответ

0

Вот как я решил проблему. Вместо использования Spring-JMX я напрямую использую javax.management apis..So мой код ниже получит любой из коннекторов, который будет достаточным, чтобы предоставить мне правильный атрибут однако он попытается подключиться к другому узлу, если ему не удастся подключиться к одному серверному узлу.

@SuppressWarnings("restriction") 
private Object getMbeanAttributeValue(String MbeanObectName, 
     String attributeName) throws IOException, 
     AttributeNotFoundException, InstanceNotFoundException, 
     MBeanException, ReflectionException, MalformedObjectNameException { 
    Object attributeValue = null; 
    JMXConnector jmxc = null; 
    try { 
     State state = metaTemplate.getSession().getState(); 
     List<String> serviceUrlList = getJmxServiceUrlList(state 
       .getConnectedHosts()); 
     jmxc = getJmxConnector(serviceUrlList); 
     ObjectName objectName = new ObjectName(MbeanObectName); 
     MBeanServerConnection mbsConnection = jmxc 
       .getMBeanServerConnection(); 

     attributeValue = mbsConnection.getAttribute(objectName, 
       attributeName); 
    } finally { 
     if (jmxc != null) 
      jmxc.close(); 
    } 
    return attributeValue; 
} 

// This will provide any one of the JMX Connector of cassandra cluster 
@SuppressWarnings("restriction") 
private JMXConnector getJmxConnector(List<String> serviceUrlList) 
     throws IOException { 
    JMXConnector jmxc = null; 
    for (String serviceUrl : serviceUrlList) { 
     JMXServiceURL url; 
     try { 
      url = new JMXServiceURL(serviceUrl); 
      jmxc = JMXConnectorFactory.connect(url, null); 
      return jmxc; 
     } catch (IOException e) { 
      log.error(
        "getJmxConnector: Error while connecting to JMX sereice {} ", 
        serviceUrl, e.getMessage()); 
     } 
    } 
    throw new IOException(
      "Not able to connect to any of Cassandra JMX connector."); 
} 
1

Вам нужны 3 различных разъема.

Или вы можете использовать что-то вроде Jolokia Proxy для доступа к нескольким серверам (используя REST вместо JSR 160).

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

  • Нет связанных вопросов^_^