java - 如何从 JMX 服务器获取 Mbean

标签 java reflection jmx mbeans spring-jmx

您好,我正在尝试获取已在 MbeanServer 中注册的 Mbean,并尝试调用一个方法并获取 IllegalArgumentException: argument type mismatch not sure why 。任何帮助将不胜感激

MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); 
//ObjectName name = new ObjectName("org.ihc.perf.monitor:type=HelloWorld");
ObjectName name = new ObjectName(beanName);
if (mbs.isRegistered(name)) {
        PerfMonitorMBean mbean =
           (PerfMonitorMBean)MBeanServerInvocationHandler.newProxyInstance(
                mbs,name,PerfMonitorMBean.class,true);
        perfMonHash.put(beanName, mbean);
        return;
}
PerfMonitor mbean = new PerfMonitor();
//PerfMonitor mbean = new PerfMonitor();
mbs.registerMBean(mbean, name);
perfMonHash.put(beanName, mbean);
//isMBeanRegistered = true;

当我尝试使用

访问 Mbean 上的方法时
perfMonHash.get(Constants.JMXMBEANNAME).addServiceData(serviceData);

我明白了:

java.lang.IllegalArgumentException: argument type mismatch
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:111)
    at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:45)
    at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:235)
    at com.sun.jmx.mbeanserver.PerInterface.invoke(PerInterface.java:138)
    at com.sun.jmx.mbeanserver.MBeanSupport.invoke(MBeanSupport.java:250)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:791)
    at javax.management.MBeanServerInvocationHandler.invoke(MBeanServerInvocationHandler.java:305)
    at $Proxy244.addServiceData(Unknown Source)
    at org.ihc.esm.service.publisher.JmxNotificationPublisher.notifyListeners(JmxNotificationPublisher.java:22)
    at org.ihc.esm.service.model.EnterpriseServiceMonitoringModel.notifyStats(EnterpriseServiceMonitoringModel.java:34)
    at org.ihc.esm.service.impl.EnterpriseServiceMonitoringServiceImpl.runtimeStatistic(EnterpriseServiceMonitoringServiceImpl.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:173)
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:89)
    at org.apache.cxf.jaxws.JAXWSMethodInvoker.invoke(JAXWSMethodInvoker.java:64)
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:75)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:107)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:123)
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:207)
    at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:213)
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:193)
    at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:128)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:185)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:108)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:751)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:164)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:242)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:216)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:132)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:338)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:221)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3284)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3254)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
    at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2163)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2089)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2074)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1513)
    at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:254)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)

我的 Mbean 实现是:

public class PerfMonitor extends NotificationBroadcasterSupport implements PerfMonitorMBean {

    private static final Logger logger = LoggerFactory.getLogger(PerfMonitor.class);
    private long sequenceNumber = 1;

    private ConcurrentHashMap<String, ServiceData> perfData=new ConcurrentHashMap<String, ServiceData>();



    public ConcurrentHashMap<String, ServiceData> getPerfData() {
        return perfData;
    }

    public void setPerfData(ConcurrentHashMap<String, ServiceData> perfData) {
        this.perfData = perfData;
    }

    public ServiceData getServiceData(String key){
    return perfData.get(key);
    }

    public void addServiceData(ServiceData serviceData){
    if(serviceData.getServiceName()!=null){
    String key=(serviceData.getServiceName()+"_"+serviceData.getRuntimeEnv()).toLowerCase().trim();
    logger.debug("Adding data for key:{}",key);
    perfData.put(key, serviceData);
    Notification n = new AttributeChangeNotification(this,
        sequenceNumber++, System.currentTimeMillis(),
        "ServiceData got added", "serviceData", "ServiceData",
        null, null);
    n.setUserData(serviceData);
    logger.debug("Sending Notification...");
    sendNotification(n);
    }
    }

//    private  ServiceData serviceData;
//
//    public ServiceData getServiceData() {
//  return serviceData;
//    }
//
//    public void setServiceData(ServiceData serviceData) {
//  this.serviceData=serviceData;
//  Notification n = new AttributeChangeNotification(this,
//      sequenceNumber++, System.currentTimeMillis(),
//      "ServiceData got added", "serviceData", "ServiceData",
//      null, null);
//  n.setUserData(serviceData);
//  sendNotification(n);
//    }

    //private static PerfMonitor mbean = new PerfMonitor();


    // private static boolean isMBeanRegistered = false;



    @Override
    public MBeanNotificationInfo[] getNotificationInfo() {
    String[] types = new String[]{
        AttributeChangeNotification.ATTRIBUTE_CHANGE
    };

    String name = AttributeChangeNotification.class.getName();
    String description = "An attribute of this MBean has changed";
    MBeanNotificationInfo info = 
        new MBeanNotificationInfo(types, name, description);
    return new MBeanNotificationInfo[]{info};
    }





}

服务数据类:

导入java.io.Serializable; 导入 java.math.BigDecimal;

public class ServiceData implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String runtimeEnv;
    private String applicationID;
    private String serviceName; // ~ Endpoint
    private String userID;
    private String guid;
    private String requestPayload;
    private String responsePayload;
    private BigDecimal requestTime;
    private BigDecimal responseTime;

    public String getRuntimeEnv() {
        return runtimeEnv;
    }
    public void setRuntimeEnv(String runtimeEnv) {
        this.runtimeEnv = runtimeEnv;
    }
    public String getApplicationID() {
        return applicationID;
    }
    public void setApplicationID(String applicationID) {
        this.applicationID = applicationID;
    }
    public String getServiceName() {
        return serviceName;
    }
    public void setServiceName(String serviceName) {
        this.serviceName = serviceName;
    }
    public String getUserID() {
        return userID;
    }
    public void setUserID(String userID) {
        this.userID = userID;
    }
    public String getGuid() {
        return guid;
    }
    public void setGuid(String guid) {
        this.guid = guid;
    }
    public String getRequestPayload() {
        return requestPayload;
    }
    public void setRequestPayload(String requestPayload) {
        this.requestPayload = requestPayload;
    }
    public String getResponsePayload() {
        return responsePayload;
    }
    public void setResponsePayload(String responsePayload) {
        this.responsePayload = responsePayload;
    }
    public BigDecimal getRequestTime() {
        return requestTime;
    }
    public void setRequestTime(BigDecimal requestTime) {
        this.requestTime = requestTime;
    }
    public BigDecimal getResponseTime() {
        return responseTime;
    }
    public void setResponseTime(BigDecimal responseTime) {
        this.responseTime = responseTime;
    }




}

最佳答案

而不是使用:

if (mbs.isRegistered(name)) {
        PerfMonitorMBean mbean =
           (PerfMonitorMBean)MBeanServerInvocationHandler.newProxyInstance(
                mbs,name,PerfMonitorMBean.class,true);
        perfMonHash.put(beanName, mbean);
        return;
}

使用:

if (mbs.isRegistered(name)) {
        PerfMonitorMBean mbean =null;
        port=System.getProperty("com.sun.management.jmxremote.port");
            JMXServiceURL url =
                    new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:"+port+"/jmxrmi");
                JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
                MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
                mbean = JMX.newMBeanProxy(mbsc, name, PerfMonitorMBean.class, true);


        perfMonHash.put(beanName, mbean);

        return;

        }

关于java - 如何从 JMX 服务器获取 Mbean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17304116/

相关文章:

java - 如何从jtable中连续勾选的jcheckbox获取值

c - 指定驻留在特定地址的类型

java图像透明度(图像丢失)

reflection - 我可以禁止 F# 编译器在 IL 代码中复制函数吗?

c# - 使用反射访问对象中结构的字段

java - 远程 JMX 连接和通知的问题

java - 如何在 JMX 中查询 J2EEServer MBean?

jmx - Spring ManagedAttribute 显示在 JMX 控制台的“操作”选项卡中

java - 提交新任务时取消当前任务的 ExecutorService

java - Java 中的线程安全枚举集