JMXBeanWrapper 无法使用修饰符 "public" 访问 class "JMX" 的成员
JMXBeanWrapper can not access a member of class "JMX" with modifiers "public"
我正在尝试使用 JMXWrapper class/project
对于一组 JMX 的当前项目 classes 所有这些都可以在 JConsole 或 VisualVM 上正常工作
对于其中一个,我尝试改编或使用 JMXWrapper
:
public interface MainJmxMBean {
boolean showIfMainIsRunning();
void stopMain();
}
和
@JMXBean(description="Administrates the Main app", sorted=true)
class MainJmx implements MainJmxMBean {
private boolean isMainRunning;
MainJmx() {
isMainRunning =true;
}
@Override
@JMXBeanOperation(name="Show If Main Is Running",
description="Shows if the Main app is running or not",
sortValue="1")
public boolean showIfMainIsRunning() {
return isMainRunning;
}
@Override
@JMXBeanOperation(description="Stops the Main app", sortValue="2")
public void stopMain() {
isMainRunning = false;
}
}
注意: 上面显示的 class 在没有注释的情况下工作正常。现在已注释以改进信息及其在 JConsole/VisualVM
中的使用
最后
private void registerMBeanWithJMXBeanWrapper(ObjectJmxMBean objectJmxMBean) {
try {
//System.out.printf("%s %n", objectJmxMBean.toString());
ObjectName objectName = new ObjectName(objectJmxMBean.getName());
server.registerMBean(new JMXBeanWrapper(objectJmxMBean.getObject()), objectName);
}
catch(MalformedObjectNameException |
InstanceAlreadyExistsException |
MBeanRegistrationException |
NotCompliantMBeanException |
IntrospectionException e) {
System.err.printf("[CanonicalName] %s - ERROR: %s %n", e.getClass().getCanonicalName(), e.getMessage());
}
}
上面的重要部分是:new JMXBeanWrapper(objectJmxMBean.getObject())
直到这里,我确实按照 post 顶部 link 中共享的 JMXBeanWrapper
文档,甚至作者的 post 中的文档,执行了所有说明:
当我 运行 主应用程序时,通过 JConsole 或 VisualVM,我可以看到正在应用的注释和预期的工作方式,因此直到这里目标似乎已经完成。
问题:问题是当我点击它们中的任何一个时出现:
完整的错误信息是:
Problem invoking stopMain:
java.lang.IllegalAccessException
Class com.udojava.jmx.wrapper.JMXBeanWrapper can not access a member of class
com.manuel.jordan.jmx.admin.MainJmx with modifiers "public"
观察: 似乎错误是由JConsole或VisualVM直接抛出的,因为根据JMXBeanWrapper.java源代码, throw new IllegalAccessException
消息的一部分没有 with modifiers "public"
语句
注意和观察: 根据 Github 上共享的项目,它是用 JDK 6 测试的,我是 using/working JDK8.
配置中可能有什么错误或缺失?
解决方法如下:
编辑自:
@JMXBean(description="Administrates the Main app", sorted=true)
class MainJmx implements MainJmxMBean {
private boolean isMainRunning;
MainJmx() {
isMainRunning =true;
}
到
@JMXBean(description="Administrates the Main app", sorted=true)
public class MainJmx implements MainJmxMBean {
private boolean isMainRunning;
MainJmx() {
isMainRunning =true;
}
结论:JMXWrapper
需要注解@JMXBean
的class一定是public
.
你怎么看构造函数可以保持package default
我正在尝试使用 JMXWrapper class/project
对于一组 JMX 的当前项目 classes 所有这些都可以在 JConsole 或 VisualVM 上正常工作
对于其中一个,我尝试改编或使用 JMXWrapper
:
public interface MainJmxMBean {
boolean showIfMainIsRunning();
void stopMain();
}
和
@JMXBean(description="Administrates the Main app", sorted=true)
class MainJmx implements MainJmxMBean {
private boolean isMainRunning;
MainJmx() {
isMainRunning =true;
}
@Override
@JMXBeanOperation(name="Show If Main Is Running",
description="Shows if the Main app is running or not",
sortValue="1")
public boolean showIfMainIsRunning() {
return isMainRunning;
}
@Override
@JMXBeanOperation(description="Stops the Main app", sortValue="2")
public void stopMain() {
isMainRunning = false;
}
}
注意: 上面显示的 class 在没有注释的情况下工作正常。现在已注释以改进信息及其在 JConsole/VisualVM
中的使用最后
private void registerMBeanWithJMXBeanWrapper(ObjectJmxMBean objectJmxMBean) {
try {
//System.out.printf("%s %n", objectJmxMBean.toString());
ObjectName objectName = new ObjectName(objectJmxMBean.getName());
server.registerMBean(new JMXBeanWrapper(objectJmxMBean.getObject()), objectName);
}
catch(MalformedObjectNameException |
InstanceAlreadyExistsException |
MBeanRegistrationException |
NotCompliantMBeanException |
IntrospectionException e) {
System.err.printf("[CanonicalName] %s - ERROR: %s %n", e.getClass().getCanonicalName(), e.getMessage());
}
}
上面的重要部分是:new JMXBeanWrapper(objectJmxMBean.getObject())
直到这里,我确实按照 post 顶部 link 中共享的 JMXBeanWrapper
文档,甚至作者的 post 中的文档,执行了所有说明:
当我 运行 主应用程序时,通过 JConsole 或 VisualVM,我可以看到正在应用的注释和预期的工作方式,因此直到这里目标似乎已经完成。
问题:问题是当我点击它们中的任何一个时出现:
完整的错误信息是:
Problem invoking stopMain:
java.lang.IllegalAccessException
Class com.udojava.jmx.wrapper.JMXBeanWrapper can not access a member of class
com.manuel.jordan.jmx.admin.MainJmx with modifiers "public"
观察: 似乎错误是由JConsole或VisualVM直接抛出的,因为根据JMXBeanWrapper.java源代码, throw new IllegalAccessException
消息的一部分没有 with modifiers "public"
注意和观察: 根据 Github 上共享的项目,它是用 JDK 6 测试的,我是 using/working JDK8.
配置中可能有什么错误或缺失?
解决方法如下:
编辑自:
@JMXBean(description="Administrates the Main app", sorted=true)
class MainJmx implements MainJmxMBean {
private boolean isMainRunning;
MainJmx() {
isMainRunning =true;
}
到
@JMXBean(description="Administrates the Main app", sorted=true)
public class MainJmx implements MainJmxMBean {
private boolean isMainRunning;
MainJmx() {
isMainRunning =true;
}
结论:JMXWrapper
需要注解@JMXBean
的class一定是public
.
你怎么看构造函数可以保持package default