Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MBeanServerConnection.invoke hangs forever

We have an app that invokes various remote methods on MBeans using MBeanServerConnection.invoke. Occasionally one of these methods hangs. Is there any way to have a timeout on the call? so that it will return with an exception if the call takes too long?

Or do I have to move all those calls into separate threads so they don't lock up the UI and require killing the app?

like image 344
CasaDelGato Avatar asked Oct 07 '22 15:10

CasaDelGato


1 Answers

See http://weblogs.java.net/blog/emcmanus/archive/2007/05/making_a_jmx_co.html

===== Update =====

I was thinking about this stuff when I first responded, but I was on my mobile and I can't type worth a damn on it.....

This is really an RMI problem, and unless you use a different protocol, there's not much you can do, except, as you say, move all those calls into separate threads so they don't lock up the UI.

But.... if you have the option of fiddling with the target server and you can customize the connecting client, you have at least 1 option which is to customize the JMXConnectorServer on your target servers.

The standard JMXConnectorServer implementation is the RMIConnectorServer. Part of it's specification is that when you create a new instance using any of the constructors (like RMIConnectorServer(JMXServiceURL url, Map environment)), the environment map can contain a key/value pair where the key is RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE and the value is a RMIClientSocketFactory. Therefore, you can specify a socket factory method like this:

RMIClientSocketFactory clientSocketFatory = new RMIClientSocketFactory() {
   public Socket createSocket(String host, int port) {
      Socket s = new Socket(host, port);
      s.setSoTimeout(3000);
   }
};

This factory creates a Socket and then sets its SO_TIMEOUT using setSoTimeout, so when the client connects using this socket, all operations, including connecting, will timeout after 3000 ms.

You could also checkout the JMXMP connector and server in the jmx-optional package of the OpenDMK. (links are to my github mavenized). No built in solution, mind you, but they're super easy to extend and JMXMP is simple TCP socket based rather than RMI, so this type of customization would be trivial.

Cheers.

like image 199
Nicholas Avatar answered Oct 12 '22 01:10

Nicholas