src/jdk.management.agent/share/classes/sun/management/jdp/JdpController.java
author clanger
Fri, 23 Feb 2018 09:55:52 +0100
changeset 48936 13a3013ae0cb
parent 47216 71c04702a3d5
permissions -rw-r--r--
8198539: Cleanup of unused imports in java/util/jar/Attributes.java (java.base) and JdpController.java (jdk.management.agent) Reviewed-by: stuefe
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
/*
48936
13a3013ae0cb 8198539: Cleanup of unused imports in java/util/jar/Attributes.java (java.base) and JdpController.java (jdk.management.agent)
clanger
parents: 47216
diff changeset
     2
 * Copyright (c) 2013, 2018, 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
 */
48936
13a3013ae0cb 8198539: Cleanup of unused imports in java/util/jar/Attributes.java (java.base) and JdpController.java (jdk.management.agent)
clanger
parents: 47216
diff changeset
    25
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    26
package sun.management.jdp;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    27
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    28
import java.io.IOException;
21295
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
    29
import java.lang.management.ManagementFactory;
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
    30
import java.lang.management.RuntimeMXBean;
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
    31
import java.lang.reflect.Field;
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
    32
import java.lang.reflect.Method;
48936
13a3013ae0cb 8198539: Cleanup of unused imports in java/util/jar/Attributes.java (java.base) and JdpController.java (jdk.management.agent)
clanger
parents: 47216
diff changeset
    33
import java.net.InetAddress;
13a3013ae0cb 8198539: Cleanup of unused imports in java/util/jar/Attributes.java (java.base) and JdpController.java (jdk.management.agent)
clanger
parents: 47216
diff changeset
    34
import java.net.UnknownHostException;
13a3013ae0cb 8198539: Cleanup of unused imports in java/util/jar/Attributes.java (java.base) and JdpController.java (jdk.management.agent)
clanger
parents: 47216
diff changeset
    35
import java.util.UUID;
21295
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
    36
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    37
/**
30655
d83f50188ca9 8080422: some docs cleanup for core libs
avstepan
parents: 29921
diff changeset
    38
 * 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
    39
 *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    40
 * <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
    41
 * provided static methods
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    42
 * {@link #startDiscoveryService(InetAddress,int,String,String) startDiscoveryService}
30655
d83f50188ca9 8080422: some docs cleanup for core libs
avstepan
parents: 29921
diff changeset
    43
 * and {@link #stopDiscoveryService() stopDiscoveryService}
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    44
 * <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
    45
 * times as it stops the running service if it is necessary.
d83f50188ca9 8080422: some docs cleanup for core libs
avstepan
parents: 29921
diff changeset
    46
 * Call to {@link #stopDiscoveryService() stopDiscoveryService}
d83f50188ca9 8080422: some docs cleanup for core libs
avstepan
parents: 29921
diff changeset
    47
 * ignored if service isn't run.
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    48
 *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    49
 *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    50
 * <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
    51
 * 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
    52
 * 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
    53
 * lead to security or network issues.
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    54
 * <ul>
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    55
 *     <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
    56
 *     <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
    57
 *     <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
    58
 * </ul>
30655
d83f50188ca9 8080422: some docs cleanup for core libs
avstepan
parents: 29921
diff changeset
    59
 *
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    60
 * <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
    61
 * corresponding keys are not placed to packet.
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    62
 */
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    63
public final class JdpController {
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
    private static class JDPControllerRunner implements Runnable {
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 final JdpJmxPacket packet;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    68
        private final JdpBroadcaster bcast;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    69
        private final int pause;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    70
        private volatile boolean shutdown = false;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    71
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    72
        private JDPControllerRunner(JdpBroadcaster bcast, JdpJmxPacket packet, int pause) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    73
            this.bcast = bcast;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    74
            this.packet = packet;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    75
            this.pause = pause;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    76
        }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    77
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    78
        @Override
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    79
        public void run() {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    80
            try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    81
                while (!shutdown) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    82
                    bcast.sendPacket(packet);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    83
                    try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    84
                        Thread.sleep(this.pause);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    85
                    } catch (InterruptedException e) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    86
                        // pass
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    87
                    }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    88
                }
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
            } catch (IOException e) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    91
              // pass;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    92
            }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    93
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    94
            // It's not possible to re-use controller,
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    95
            // nevertheless reset shutdown variable
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    96
            try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    97
                stop();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    98
                bcast.shutdown();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    99
            } catch (IOException ex) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   100
                // pass - ignore IOException during shutdown
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   101
            }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   102
        }
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
        public void stop() {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   105
            shutdown = true;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   106
        }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   107
    }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   108
    private static JDPControllerRunner controller = null;
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 JdpController(){
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   111
        // Don't allow to instantiate this class.
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   112
    }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   113
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   114
    // Utility to handle optional system properties
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   115
    // 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
   116
    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
   117
        try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   118
            return (val == null) ? dflt : Integer.parseInt(val);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   119
        } catch (NumberFormatException ex) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   120
            throw new JdpException(msg);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   121
        }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   122
    }
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
    // 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
   125
    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
   126
        try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   127
            return (val == null) ? dflt : InetAddress.getByName(val);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   128
        } catch (UnknownHostException ex) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   129
            throw new JdpException(msg);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   130
        }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   131
    }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   132
21295
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   133
    // Get the process id of the current running Java process
45890
cabbc1289586 8183123: JDP packets have no processId context set
clanger
parents: 43494
diff changeset
   134
    private static Long getProcessId() {
21295
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   135
        try {
45890
cabbc1289586 8183123: JDP packets have no processId context set
clanger
parents: 43494
diff changeset
   136
            // Get the current process id
cabbc1289586 8183123: JDP packets have no processId context set
clanger
parents: 43494
diff changeset
   137
            return ProcessHandle.current().pid();
cabbc1289586 8183123: JDP packets have no processId context set
clanger
parents: 43494
diff changeset
   138
        } catch(UnsupportedOperationException ex) {
21295
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   139
            return null;
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   140
        }
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   141
    }
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
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   144
    /**
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   145
     * Starts discovery service
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   146
     *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   147
     * @param address - multicast group address
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   148
     * @param port - udp port to use
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   149
     * @param instanceName - name of running JVM instance
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   150
     * @param url - JMX service url
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   151
     * @throws IOException
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   152
     */
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   153
    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
   154
            throws IOException, JdpException {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   155
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   156
        // Limit packet to local subnet by default
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   157
        int ttl = getInteger(
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   158
                System.getProperty("com.sun.management.jdp.ttl"), 1,
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   159
                "Invalid jdp packet ttl");
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   160
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   161
        // Broadcast once a 5 seconds by default
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   162
        int pause = getInteger(
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   163
                System.getProperty("com.sun.management.jdp.pause"), 5,
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   164
                "Invalid jdp pause");
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
        // Converting seconds to milliseconds
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   167
        pause = pause * 1000;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   168
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   169
        // Allow OS to choose broadcast source
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   170
        InetAddress sourceAddress = getInetAddress(
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   171
                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
   172
                "Invalid source address provided");
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   173
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   174
        // Generate session id
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   175
        UUID id = UUID.randomUUID();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   176
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   177
        JdpJmxPacket packet = new JdpJmxPacket(id, url);
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
        // 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
   180
        // Strip everything after first space
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   181
        String javaCommand = System.getProperty("sun.java.command");
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   182
        if (javaCommand != null) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   183
            String[] arr = javaCommand.split(" ", 2);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   184
            packet.setMainClass(arr[0]);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   185
        }
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
        // 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
   188
        // 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
   189
        packet.setInstanceName(instanceName);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   190
21295
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   191
        // 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
   192
        // java.rmi.server.hostname
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   193
        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
   194
        packet.setRmiHostname(rmiHostname);
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   195
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   196
        // Set broadcast interval
25522
10d789df41bb 8049892: Replace uses of 'new Integer()' with appropriate alternative across core classes
prr
parents: 21295
diff changeset
   197
        packet.setBroadcastInterval(Integer.toString(pause));
21295
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   198
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   199
        // Set process id
45890
cabbc1289586 8183123: JDP packets have no processId context set
clanger
parents: 43494
diff changeset
   200
        Long pid = getProcessId();
21295
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   201
        if (pid != null) {
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   202
           packet.setProcessId(pid.toString());
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   203
        }
5c73446feb1f 8004213: JDP packet needs pid, broadcast interval and rmi server hostname fields
dsamersoff
parents: 15653
diff changeset
   204
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   205
        JdpBroadcaster bcast = new JdpBroadcaster(address, sourceAddress, port, ttl);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   206
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   207
        // Stop discovery service if it's already running
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   208
        stopDiscoveryService();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   209
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   210
        controller = new JDPControllerRunner(bcast, packet, pause);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   211
37518
cd27455e4276 8147553: Remove sun.misc.ManagedLocalsThread from java.management
chegar
parents: 30655
diff changeset
   212
        Thread t = new Thread(null, controller, "JDP broadcaster", 0, false);
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   213
        t.setDaemon(true);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   214
        t.start();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   215
    }
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
    /**
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   218
     * Stop running discovery service,
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   219
     * 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
   220
     */
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   221
    public static synchronized void stopDiscoveryService() {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   222
        if ( controller != null ){
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   223
             controller.stop();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   224
             controller = null;
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
}