2016-05-04 30 views
0

Ich habe versucht, eine Operation auf ThreadMXBean in einem Remote-JVM aufzurufen. Das Codefragment I invoke der Operation verwendet wird, ist untenThread-Dumps eines Remote-JVM programmgesteuert erstellen

bean = new ObjectName("java.lang:type=Threading"); 
     memoryInfo = RemoteConnector.getRemote().getMBeanInfo(bean); 
     RemoteConnector.getRemote().getObjectInstance(bean); 
     MBeanOperationInfo [] mBeanAttributeInfos = memoryInfo.getOperations(); 
     for(MBeanOperationInfo mBeanAttributeInfo : mBeanAttributeInfos){ 
      System.out.println(mBeanAttributeInfo.getName()); 
     } 
     long [] allThreadIds = (long [])RemoteConnector.getRemote().getAttribute(bean,"AllThreadIds"); 
     Object [] params = new Object[2]; 
     int maxDepth = 100; 
     params[0] = allThreadIds; 
     params[1] = maxDepth; 
     String [] opSigs = {allThreadIds.getClass().getName(),"I"}; 
     RemoteConnector.getRemote().invoke(bean,"getThreadInfo",params,opSigs); 

anzumerken, dass getRemote() Methode eine mbeanserverconnection

zurückgibt, kann ich die Methode getThreadInfo() auf Stummel nicht aufrufen. Ich erhalte diese Meldung

2016-05-05 00:17:37 ERROR ThreadDumpCreator:67 - Operation getThreadInfo exists but not with this signature: ([J, I) 

Bitte helfen Sie mir, dieses Problem zu beheben :)

unterhalb der Methode i entfernten MBeanServer angeschlossen haben

public class RemoteConnector { 

private static MBeanServerConnection remote = null; 
private static JMXConnector connector = null; 

public static void defaultConnector(){ 
    try { 
     JMXServiceURL target = new JMXServiceURL 
       ("service:jmx:rmi://localhost:11111/jndi/rmi://localhost:9999/jmxrmi"); 
     //for passing credentials for password 
     Map<String, String[]> env = new HashMap<String, String[]>(); 
     String[] credentials = {"admin", "admin"}; 
     env.put(JMXConnector.CREDENTIALS, credentials); 

     connector = JMXConnectorFactory.connect(target, env); 
     remote = connector.getMBeanServerConnection(); 

    }catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public static MBeanServerConnection getRemote() { 
    return remote; 
} 

public static void setRemote(MBeanServerConnection remote) { 
    RemoteConnector.remote = remote; 
} 

public static void closeConnection() throws IOException { 
    if(connector != null){ 
     connector.close(); 
    } 
} 

}

Antwort

1

Anscheinend sollte ich verwendet int.class.getName(), da die Methodensignatur von der Aufrufmethode

erfordert