javax.management.AttributeNotFoundException 8.5.35 及以上

javax.management.AttributeNotFoundException 8.5.35 AND above

我收到的错误是:找不到 org.apache.tomcat.util.net.SocketProperties

的属性 XXX

当我调用 mBeanServer.getAttribute(blah, blah)

时被抛出

根据我的理解,这是 Tomcat 8.5.35 中的错误并已在 8.5.36 中修复 - 尽管我发现它也已在 8.5.40 中报告。

我在我的 Eclipse 中添加了一些 tomcat 安装以尝试缩小范围,这就是我发现的:

8.5.30 作品

8.5.34 作品

8.5.35 错误

8.5.37 错误

8.5.40 错误

8.5.45 错误

8.5.51 错误

请注意,我无法在 tomcat 下载页面上找到 8.5.36。

我无法想象在 8.5.35 中发现的一个本应在 8.5.36 中修复的错误会一直存在到 8.5.51 及更高版本。这段代码以前在 Tomcat 的较小版本中运行良好多年,但在 8.5.35 及更高版本中已被扼杀。

我要确定的是,是否有其他更改或引入的参数现在可能需要作为阻止读取的安全措施。比如运行8.5.51的时候,我要在server.xml里面的Connector中加上secretRequired参数,不然就卡住了。这是一个不相关的部分,但希望你能理解我所说的引入新参数的意思。

在故障排除中,我看到了属性名称、对象名称等,但是当我查找存储在属性中的值时,它出现了问题。

想知道8.5.34之后是否有一些增强措施需要设置。对此有什么想法吗?

经过大量挖掘,我终于弄清楚了这个问题。请注意,在 8.5.35 中报告的 'bug' 已在 8.5.36 中修复,这显然根本不是错误。纯粹是我的猜测,但报告的问题存在于后续 TomCat 版本中,而 8.5.36 无处可寻。

在获取用于调用mBeanServer.getAttribute() 的mBean Set 时,实际上传递了2 个mBean 对象- 一个是有效的原始对象,另一个有一个额外的键- "subtype=SocketProperties"。那个额外的键是在我的代码中抛出错误的原因。

在 8.5.35 之前,只有一个不包含子类型键的 mBean 集。

我的代码基本上是构建一个针对 "Type=ThreadPool".

过滤的 ObjectInstances 数组

例如,在 8.5.35 之前的默认 Tomcat 安装中,您获得的 ObjectName 为:

Catalina:type=ThreadPool,name="blah blah blah"

从 8.5.35 开始你得到 2:

Catalina:type=ThreadPool,name="blah blah blah"

Catalina:type=ThreadPool,name="blah blah blah",subType=SocketProperties

是第二个触发了后续错误: "cannot find attribute maxthreads for org.apache.tomcat.util.net.socketproperties" 当它遇到以下代码行时:

mBeanServer.getAttribute(objectName, "maxThreads")

通过简单地将包含子类型键的 objectNames 排除在添加到我的数组中之外,问题就解决了。

filter = "*:type=ThreadPool,*";
objectName = new ObjectName(filter);
Set<ObjectInstance> setOfInstances = mBeanServer.queryMBeans(objectName, null);
for (ObjectInstance objInst : setOfInstances)
{
    if(!objInst.getObjectName().getKeyPropertyListString().contains("subType"))
        ArrayOfObjects.addElement(objInst.getObjectName());
}

我确信有一种更简洁的方法可以做到这一点,我很想听听,但我很高兴终于找出我的问题的原因并解决它。

希望这些信息可以帮助遇到同样问题的其他人。