2013-06-25 100 views
3

您好我想獲得Mbean已經在MbeanServer中註冊並試圖調用一個方法並獲取IllegalArgumentException:參數類型不匹配不知道爲什麼。任何幫助將高度讚賞如何從JMX服務器獲取Mbean

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; 

,當我嘗試使用

perfMonHash.get(Constants.JMXMBEANNAME).addServiceData(serviceData); 

來訪問該MBean的方法獲得:

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}; 
    } 





} 

ServiceData等級:

import java.io.Serializable; import 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; 
    } 




} 
+0

我想'serviceData'是相同的版本'ServiceData'作爲JMX服務器上運行的一個?你能展示它的定義嗎? – Gray

+0

您可能需要考慮使用像我的SimpleJmx這樣的JMX包,它具有客戶端和服務器端,爲您處理所有這些問題。 http://256.com/sources/simplejmx/ – Gray

+0

嗨,格雷我添加了服務數據類。我使用Junit創建了類似的場景,並且它在weblogic上無法正常工作 – remo

回答

2

而不是使用:

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; 

     }