C3P0Registry mbean 未注册到 MBeanServer。获取 InstanceNotFoundException

C3P0Registry mbean is not being registered with MBeanServer. Getting InstanceNotFoundException

我正在尝试使用名为 getdbPoolStatistics() 的函数获取 dbpool 详细信息,该函数 returns 是我要监视的所有指标的哈希图。 在 getdbPoolStatistics() 中,我使用 C3P0Registry.getPooledDataSources() which returns 2 db pools 然后使用迭代器访问池,即 connectionIterator .

获取令牌,在创建 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,键值:type=PooledDataSource 和 identityToken= 我已添加到 ArrayList 中的令牌,用于来自 C3P0Registry 的 2 个数据库池对象。

现在,如果我使用 mbs.registerMBean()

注册 ObjectName
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,然后尝试获取属性并将其放入 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 默认注册它的 MBean。如果您不想让他们注册,则必须为此努力。如果您在监控 c3p0 池及其注册表时遇到问题,您可能需要调试一般的 JMX 内容。您在同一个 JVM 上看到其他 MBean 了吗?如果没有,您可能需要设置一些系统属性。有关一些提示,请参阅 here

如果您想在 c3p0 中关闭 JMX 注册,即如果您想禁用 JMX MBean 注册,则只需执行任何特殊操作。

您还可以为您的 c3p0 MBean 自定义 and/or 稳定名称。

但是您永远不必进入低级 JMX API,例如定义您自己的 ObjectName 对象。 c3p0 会为您处理。

请参阅 c3p0 文档的 JMX 部分,here

p.s。 c3p0 不包含 getdbPoolStatistics() 方法,它可能是您自己的库的一部分。