C3P0Registry mbean未在MBeanServer中注册。获取InstanceNotFoundException

时间:2016-12-30 13:39:01

标签: java jmx c3p0 mbeans objectname

我正在尝试使用名为getdbPoolStatistics()的函数获取dbpool详细信息,该函数返回我将要监视的所有矩阵的散列图。 在getdbPoolStatistics()中,我使用C3P0Registry.getPooledDataSources()返回 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时,我使用了Domain:com.mchange.v2.c3p0,key-value:type = PooledDataSource和identityToken = token,我已经从C3P0Registry中为2个db池对象添加到ArrayList。

现在,如果我使用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()在很多例子中都没有使用,所以我删除了那行代码并尝试过。

如果我只保留make 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()以及我是否以正确的方式使用它?请帮忙。

1 个答案:

答案 0 :(得分:0)

我认为你可能做的工作比你需要的多得多。

c3p0默认注册其MBean。如果你不想让他们注册,你必须在那里工作。如果您在监视c3p0池及其注册表时遇到问题,则可能需要调试常规JMX内容。你在同一个JVM上看到其他MBean吗?如果没有,您可能需要设置一些系统属性。有关提示,请参阅here

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

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

但是你应该永远不必进入低级JMX API,比如定义自己的ObjectName对象。 c3p0会照顾你。

请参阅c3p0文档的JMX部分here

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