Я пытаюсь получить данные 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() или нет, а также, если я правильно ее использую? Пожалуйста помоги.
действительно, c3p0 уже зарегистрирован mbeans. Спасибо :) – Falcon34
Я очень рад, что это сработало для вас! –