Dinanjana
Dinanjana

Reputation: 162

Creating thread dumps of a remote jvm programatically

I have been trying to invoke an operation on ThreadMXBean in a remote jvm. The code snippet I used invoke the operation is below

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

Note that getRemote() method returns a mbeanserverconnection

I can't invoke the method getThreadInfo() on stub. I am getting this message

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

Please help me resolve this issue :)

Below is the method i used to connect remote mbeanserver

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

}

Upvotes: 0

Views: 331

Answers (1)

Dinanjana
Dinanjana

Reputation: 162

Apparently I should have used int.class.getName() as the method signature requires from invoke method

Upvotes: 1

Related Questions