blob: 0b220e0edc886b4595cda8778ff24c5197072493 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2004-2005 Sun Microsystems, Inc. All Rights Reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * - Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * - Neither the name of Sun Microsystems nor the names of its
16 * contributors may be used to endorse or promote products derived
17 * from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
20 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32/*
33 */
34
35import javax.management.*;
36import javax.management.remote.*;
37import java.io.IOException;
38import java.net.MalformedURLException;
39
40/**
41 * This FullThreadDump class demonstrates the capability to get
42 * a full thread dump and also detect deadlock remotely.
43 */
44public class FullThreadDump {
45 private MBeanServerConnection server;
46 private JMXConnector jmxc;
47 public FullThreadDump(String hostname, int port) {
48 System.out.println("Connecting to " + hostname + ":" + port);
49
50 // Create an RMI connector client and connect it to
51 // the RMI connector server
52 String urlPath = "/jndi/rmi://" + hostname + ":" + port + "/jmxrmi";
53 connect(urlPath);
54 }
55
56 public void dump() {
57 try {
58 ThreadMonitor monitor = new ThreadMonitor(server);
59 monitor.threadDump();
60 if (!monitor.findDeadlock()) {
61 System.out.println("No deadlock found.");
62 }
63 } catch (IOException e) {
64 System.err.println("\nCommunication error: " + e.getMessage());
65 System.exit(1);
66 }
67 }
68
69 /**
70 * Connect to a JMX agent of a given URL.
71 */
72 private void connect(String urlPath) {
73 try {
74 JMXServiceURL url = new JMXServiceURL("rmi", "", 0, urlPath);
75 this.jmxc = JMXConnectorFactory.connect(url);
76 this.server = jmxc.getMBeanServerConnection();
77 } catch (MalformedURLException e) {
78 // should not reach here
79 } catch (IOException e) {
80 System.err.println("\nCommunication error: " + e.getMessage());
81 System.exit(1);
82 }
83 }
84
85 public static void main(String[] args) {
86 if (args.length != 1) {
87 usage();
88 }
89
90 String[] arg2 = args[0].split(":");
91 if (arg2.length != 2) {
92 usage();
93 }
94 String hostname = arg2[0];
95 int port = -1;
96 try {
97 port = Integer.parseInt(arg2[1]);
98 } catch (NumberFormatException x) {
99 usage();
100 }
101 if (port < 0) {
102 usage();
103 }
104
105 // get full thread dump and perform deadlock detection
106 FullThreadDump ftd = new FullThreadDump(hostname, port);
107 ftd.dump();
108 }
109
110 private static void usage() {
111 System.out.println("Usage: java FullThreadDump <hostname>:<port>");
112 }
113}