gpt4 book ai didi

java - C3P0Registry mbean 未向 MBeanServer 注册。获取 InstanceNotFoundException

转载 作者:太空宇宙 更新时间:2023-11-04 11:55:57 24 4
gpt4 key购买 nike

我正在尝试使用名为 getdbPoolStatistics() 的函数获取 dbpool 详细信息,该函数返回我要监视的所有指标的 HashMap 。在 getdbPoolStatistics() 中,我使用 C3P0Registry.getPooledDataSources() 返回 2 个数据库池,然后使用迭代器(即 connectionIterator )访问这些池。

获取 token ,该 token 在创建 ObjectName 期间进一步使用。

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

mbean 为您提供监控信息。

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

获取token并将其添加到ArrayList中。

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

之后我们需要获取 MBeanServer

MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
<小时/>

在注册 mbean 时,我使用了域:com.mchange.v2.c3p0、键值:type=PooledDataSource 和identityToken= token ,这些 token 是我从 C3P0Registry 添加到 ArrayList 的 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,然后尝试 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 默认注册其 MBean。如果你不希望他们注册,你就必须努力做到这一点。如果您在监控 c3p0 池及其注册表时遇到问题,您可能需要调试常规 JMX 内容。您是否在同一 JVM 上看到其他 MBean?如果没有,您可能需要设置一些系统属性。请参阅here一些提示。

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

您还可以为您的 c3p0 MBean 指定自定义和/或稳定的名称。

但是您永远不必接触低级 JMX API,例如定义您自己的 ObjectName 对象。 c3p0 会为您处理这些事情。

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

附: c3p0 不包含 getdbPoolStatistics() 方法,该方法可能是您自己的库的一部分。

关于java - C3P0Registry mbean 未向 MBeanServer 注册。获取 InstanceNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41397225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com