2016-12-30 10 views
1

Я пытаюсь получить данные dbpool, используя мою функцию с именем getdbPoolStatistics(), которая возвращает хэш-карту всех метриков, которые я собираюсь контролировать. В getdbPoolStatistics() я использую C3P0Registry.getPooledDataSources(), который возвращает 2 пула db, а затем получает доступ к пулам с помощью итератора, то есть connectionIterator.C3P0Registry mbean не регистрируется в MBeanServer. Получение InstanceNotFoundException

Чтобы получить токен, который далее используется при создании ObjectName.

ArrayList<String> pooledDataSourcesIdentityTokenList = new ArrayList<String>();  

mbean, который дает вам информацию для мониторинга.

Iterator<PooledDataSource> connectionIterator = C3P0Registry.getPooledDataSources().iterator();  

Получить токен и добавить его в ArrayList.

while(connectionIterator.hasNext()) { 
     pooledDataSourcesIdentityTokenList.add(connectionIterator.next().getIdentityToken()); 
} 

После этого мы должны получить MBeanServer

MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); 

При регистрации MBean, я использовал домен: com.mchange.v2.c3p0, ключ-значение: тип = PooledDataSource и identityToken = токен, который я добавил в ArrayList для двух пустых объектов из C3P0Registry.

Теперь, если я зарегистрировать ObjectName с помощью mbs.registerMBean()

for (int i = 0; i < pooledDataSourcesIdentityTokenList.size() ; i++) { 
    ObjectName objName = new ObjectName("com.mchange.v2.c3p0:type=PooledDataSource,identityToken="+pooledDataSourcesIdentityTokenList.get(i)+",*"); 
    mbs.registerMBean(connectionIterator2.next(), objName.getInstance("com.mchange.v2.c3p0","identityToken",pooledDataSourcesIdentityTokenList.get(i))); 
} 

я получить

:error: unreported exception InstanceAlreadyExistsException; must be caught or declared to be thrown 

Теперь, если я использую полные объекты вместо итерацию над ним.

for (int i = 0; i < pooledDataSourcesIdentityTokenList.size() ; i++) { 
     ObjectName objName = new ObjectName("com.mchange.v2.c3p0:type=PooledDataSource,identityToken="+pooledDataSourcesIdentityTokenList.get(i)+",*"); 
     mbs.registerMBean(C3P0Registry.getPooledDataSources() , objName); 
     startTimeMillisArray[i] = (String)(mbs.getAttribute(objName, "startTimeMillisDefaultUser")); 
} 

я получаю:

error: unreported exception InstanceAlreadyExistsException; must be caught or declared to be thrown mbs.registerMBean(C3P0Registry.getPooledDataSources() , objName); 

Как InstanceAlreadyExistsException, я думал не регистрации MBean Также я обнаружил, что registerMBean(), не был использован во многих примерах, так что я удалил эту строку кода и попробовал.

Если я только держать сделать ObjectName, а затем попытаться GetAttribute и поместить его в startTimeMillisArray

for (int i = 0; (i < pooledDataSourcesIdentityTokenList.size() ; i++) { 
    ObjectName objName = new ObjectName("com.mchange.v2.c3p0:type=PooledDataSource,identityToken="+pooledDataSourcesIdentityTokenList.get(i)+",*"); 
    //No registering mbean here. 
    startTimeMillisArray[i] = (String)(mbs.getAttribute(objName, "startTimeMillisDefaultUser")); 
} 

тогда я получаю ошибку:

javax.management.InstanceNotFoundException: com.mchange.v2.c3p0:type=PooledDataSource,identityToken=2ufaha9lm5mbruczledo|86ffe7,* 
javax.management.InstanceNotFoundException: com.mchange.v2.c3p0:type=PooledDataSource,identityToken=2ufaha9lm5mbruczledo|c7dca5,* 

Это создает много путаница, следует ли использовать registerMBean() или нет, а также, если я правильно ее использую? Пожалуйста помоги.

ответ

0

Думаю, вы можете делать гораздо больше работы, чем вам нужно.

c3p0 регистрирует свои MBeans по умолчанию. Если вы не хотите, чтобы они были зарегистрированы, вы должны работать над этим. Если у вас возникли проблемы с контролем пулов c3p0 и его реестра, вам может потребоваться отладить общие материалы JMX. Вы видите другие MBeans на одной JVM?Если нет, вам может потребоваться установить некоторые свойства системы. См. here для получения некоторых советов.

Вам нужно сделать только что-нибудь особенное, если вы хотите отключить регистрацию JMX в c3p0, то есть если вы хотите отключить регистрацию JMX MBean.

Вы также можете указать свои c3p0 MBeans индивидуальные и/или стабильные имена.

Но вам никогда не придется попадать в низкоуровневые API-интерфейсы JMX, например, определять свои собственные объекты ObjectName. c3p0 заботится об этом для вас.

См. Раздел JMX в документах c3p0, here.

p.s. c3p0 не включает метод getdbPoolStatistics(), который может быть частью ваших собственных библиотек.

+0

действительно, c3p0 уже зарегистрирован mbeans. Спасибо :) – Falcon34

+0

Я очень рад, что это сработало для вас! –

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

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