jdk/src/java.management/share/classes/sun/management/jdp/JdpController.java
author avstepan
Tue, 19 May 2015 16:04:14 +0400
changeset 30655 d83f50188ca9
parent 29921 f13586cdb0e4
child 37518 cd27455e4276
permissions -rw-r--r--
8080422: some docs cleanup for core libs Summary: some docs cleanup Reviewed-by: rriggs, lancea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
     1
/*
15653
ce470531e852 8007536: Incorrect copyright header in JDP files
dsamersoff
parents: 15531
diff changeset
     2
 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
     4
 *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
15653
ce470531e852 8007536: Incorrect copyright header in JDP files
dsamersoff
parents: 15531
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
ce470531e852 8007536: Incorrect copyright header in JDP files
dsamersoff
parents: 15531
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
ce470531e852 8007536: Incorrect copyright header in JDP files
dsamersoff
parents: 15531
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    10
 *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    15
 * accompanied this code).
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    16
 *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    20
 *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    23
 * questions.
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    24
 */
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    25
package sun.management.jdp;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    26
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    27
import java.io.IOException;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    28
import java.net.InetAddress;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    29
import java.net.UnknownHostException;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    30
import java.util.UUID;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    31
21295
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
    32
import java.lang.management.ManagementFactory;
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
    33
import java.lang.management.RuntimeMXBean;
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
    34
import java.lang.reflect.Field;
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
    35
import java.lang.reflect.Method;
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
    36
import sun.management.VMManagement;
29921
f13586cdb0e4 8042327: Enhance thread contexts in serviceability
jbachorik
parents: 25859
diff changeset
    37
import sun.misc.ManagedLocalsThread;
21295
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
    38
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    39
/**
30655
d83f50188ca9 8080422: some docs cleanup for core libs
avstepan
parents: 29921
diff changeset
    40
 * JdpController is responsible to create and manage a broadcast loop.
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    41
 *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    42
 * <p> Other part of code has no access to broadcast loop and have to use
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    43
 * provided static methods
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    44
 * {@link #startDiscoveryService(InetAddress,int,String,String) startDiscoveryService}
30655
d83f50188ca9 8080422: some docs cleanup for core libs
avstepan
parents: 29921
diff changeset
    45
 * and {@link #stopDiscoveryService() stopDiscoveryService}
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    46
 * <p>{@link #startDiscoveryService(InetAddress,int,String,String) startDiscoveryService} could be called multiple
30655
d83f50188ca9 8080422: some docs cleanup for core libs
avstepan
parents: 29921
diff changeset
    47
 * times as it stops the running service if it is necessary.
d83f50188ca9 8080422: some docs cleanup for core libs
avstepan
parents: 29921
diff changeset
    48
 * Call to {@link #stopDiscoveryService() stopDiscoveryService}
d83f50188ca9 8080422: some docs cleanup for core libs
avstepan
parents: 29921
diff changeset
    49
 * ignored if service isn't run.
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    50
 *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    51
 *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    52
 * <p> System properties below could be used to control broadcast loop behavior.
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    53
 * Property below have to be set explicitly in command line. It's not possible to
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    54
 * set it in management.config file.  Careless changes of these properties could
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    55
 * lead to security or network issues.
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    56
 * <ul>
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    57
 *     <li>com.sun.management.jdp.ttl         - set ttl for broadcast packet</li>
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    58
 *     <li>com.sun.management.jdp.pause       - set broadcast interval in seconds</li>
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    59
 *     <li>com.sun.management.jdp.source_addr - an address of interface to use for broadcast</li>
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    60
 * </ul>
30655
d83f50188ca9 8080422: some docs cleanup for core libs
avstepan
parents: 29921
diff changeset
    61
 *
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    62
 * <p>null parameters values are filtered out on {@link JdpPacketWriter} level and
30655
d83f50188ca9 8080422: some docs cleanup for core libs
avstepan
parents: 29921
diff changeset
    63
 * corresponding keys are not placed to packet.
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    64
 */
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    65
public final class JdpController {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    66
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    67
    private static class JDPControllerRunner implements Runnable {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    68
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    69
        private final JdpJmxPacket packet;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    70
        private final JdpBroadcaster bcast;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    71
        private final int pause;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    72
        private volatile boolean shutdown = false;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    73
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    74
        private JDPControllerRunner(JdpBroadcaster bcast, JdpJmxPacket packet, int pause) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    75
            this.bcast = bcast;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    76
            this.packet = packet;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    77
            this.pause = pause;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    78
        }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    79
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    80
        @Override
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    81
        public void run() {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    82
            try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    83
                while (!shutdown) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    84
                    bcast.sendPacket(packet);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    85
                    try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    86
                        Thread.sleep(this.pause);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    87
                    } catch (InterruptedException e) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    88
                        // pass
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    89
                    }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    90
                }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    91
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    92
            } catch (IOException e) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    93
              // pass;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    94
            }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    95
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    96
            // It's not possible to re-use controller,
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    97
            // nevertheless reset shutdown variable
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    98
            try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    99
                stop();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   100
                bcast.shutdown();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   101
            } catch (IOException ex) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   102
                // pass - ignore IOException during shutdown
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   103
            }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   104
        }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   105
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   106
        public void stop() {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   107
            shutdown = true;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   108
        }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   109
    }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   110
    private static JDPControllerRunner controller = null;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   111
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   112
    private JdpController(){
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   113
        // Don't allow to instantiate this class.
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   114
    }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   115
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   116
    // Utility to handle optional system properties
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   117
    // Parse an integer from string or return default if provided string is null
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   118
    private static int getInteger(String val, int dflt, String msg) throws JdpException {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   119
        try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   120
            return (val == null) ? dflt : Integer.parseInt(val);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   121
        } catch (NumberFormatException ex) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   122
            throw new JdpException(msg);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   123
        }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   124
    }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   125
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   126
    // Parse an inet address from string or return default if provided string is null
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   127
    private static InetAddress getInetAddress(String val, InetAddress dflt, String msg) throws JdpException {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   128
        try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   129
            return (val == null) ? dflt : InetAddress.getByName(val);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   130
        } catch (UnknownHostException ex) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   131
            throw new JdpException(msg);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   132
        }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   133
    }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   134
21295
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   135
    // Get the process id of the current running Java process
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   136
    private static Integer getProcessId() {
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   137
        try {
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   138
            // Get the current process id using a reflection hack
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   139
            RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   140
            Field jvm = runtime.getClass().getDeclaredField("jvm");
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   141
            jvm.setAccessible(true);
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   142
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   143
            VMManagement mgmt = (sun.management.VMManagement) jvm.get(runtime);
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   144
            Method pid_method = mgmt.getClass().getDeclaredMethod("getProcessId");
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   145
            pid_method.setAccessible(true);
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   146
            Integer pid = (Integer) pid_method.invoke(mgmt);
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   147
            return pid;
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   148
        } catch(Exception ex) {
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   149
            return null;
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   150
        }
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   151
    }
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   152
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   153
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   154
    /**
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   155
     * Starts discovery service
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   156
     *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   157
     * @param address - multicast group address
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   158
     * @param port - udp port to use
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   159
     * @param instanceName - name of running JVM instance
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   160
     * @param url - JMX service url
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   161
     * @throws IOException
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   162
     */
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   163
    public static synchronized void startDiscoveryService(InetAddress address, int port, String instanceName, String url)
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   164
            throws IOException, JdpException {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   165
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   166
        // Limit packet to local subnet by default
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   167
        int ttl = getInteger(
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   168
                System.getProperty("com.sun.management.jdp.ttl"), 1,
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   169
                "Invalid jdp packet ttl");
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   170
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   171
        // Broadcast once a 5 seconds by default
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   172
        int pause = getInteger(
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   173
                System.getProperty("com.sun.management.jdp.pause"), 5,
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   174
                "Invalid jdp pause");
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   175
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   176
        // Converting seconds to milliseconds
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   177
        pause = pause * 1000;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   178
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   179
        // Allow OS to choose broadcast source
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   180
        InetAddress sourceAddress = getInetAddress(
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   181
                System.getProperty("com.sun.management.jdp.source_addr"), null,
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   182
                "Invalid source address provided");
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   183
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   184
        // Generate session id
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   185
        UUID id = UUID.randomUUID();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   186
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   187
        JdpJmxPacket packet = new JdpJmxPacket(id, url);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   188
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   189
        // Don't broadcast whole command line for security reason.
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   190
        // Strip everything after first space
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   191
        String javaCommand = System.getProperty("sun.java.command");
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   192
        if (javaCommand != null) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   193
            String[] arr = javaCommand.split(" ", 2);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   194
            packet.setMainClass(arr[0]);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   195
        }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   196
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   197
        // Put optional explicit java instance name to packet, if user doesn't specify
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   198
        // it the key is skipped. PacketWriter is responsible to skip keys having null value.
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   199
        packet.setInstanceName(instanceName);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   200
21295
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   201
        // Set rmi server hostname if it explicitly specified by user with
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   202
        // java.rmi.server.hostname
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   203
        String rmiHostname = System.getProperty("java.rmi.server.hostname");
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   204
        packet.setRmiHostname(rmiHostname);
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   205
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   206
        // Set broadcast interval
25522
10d789df41bb 8049892: Replace uses of 'new Integer()' with appropriate alternative across core classes
prr
parents: 21295
diff changeset
   207
        packet.setBroadcastInterval(Integer.toString(pause));
21295
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   208
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   209
        // Set process id
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   210
        Integer pid = getProcessId();
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   211
        if (pid != null) {
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   212
           packet.setProcessId(pid.toString());
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   213
        }
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   214
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   215
        JdpBroadcaster bcast = new JdpBroadcaster(address, sourceAddress, port, ttl);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   216
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   217
        // Stop discovery service if it's already running
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   218
        stopDiscoveryService();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   219
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   220
        controller = new JDPControllerRunner(bcast, packet, pause);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   221
29921
f13586cdb0e4 8042327: Enhance thread contexts in serviceability
jbachorik
parents: 25859
diff changeset
   222
        Thread t = new ManagedLocalsThread(controller, "JDP broadcaster");
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   223
        t.setDaemon(true);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   224
        t.start();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   225
    }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   226
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   227
    /**
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   228
     * Stop running discovery service,
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   229
     * it's safe to attempt to stop not started service
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   230
     */
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   231
    public static synchronized void stopDiscoveryService() {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   232
        if ( controller != null ){
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   233
             controller.stop();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   234
             controller = null;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   235
        }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   236
    }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   237
}