jdk/src/share/classes/sun/management/jdp/JdpController.java
author dsamersoff
Sun, 03 Feb 2013 21:39:58 +0400
changeset 15531 071efc9f31ad
child 15653 ce470531e852
permissions -rw-r--r--
8002048: Protocol to discovery of manageable Java processes on a network Summary: Introduce a protocol to discover manageble Java instances across a network subnet, JDP Reviewed-by: sla, dfuchs
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
/*
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
     2
 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
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
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
     7
 * published by the Free Software Foundation.
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
     8
 *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
     9
 * 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
    10
 * 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
    11
 * 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
    12
 * 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
    13
 * accompanied this code).
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    14
 *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    15
 * 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
    16
 * 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
    17
 * 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
    18
 *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    19
 * 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
    20
 * 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
    21
 * questions.
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    22
 */
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    23
package sun.management.jdp;
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
import java.io.IOException;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    26
import java.net.InetAddress;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    27
import java.net.UnknownHostException;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    28
import java.util.UUID;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    29
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    30
/**
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    31
 * JdpController is responsible to create and manage a broadcast loop
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    32
 *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    33
 * <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
    34
 * provided static methods
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    35
 * {@link #startDiscoveryService(InetAddress,int,String,String) startDiscoveryService}
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    36
 * and {@link #stopDiscoveryService() stopDiscoveryService}</p>
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    37
 * <p>{@link #startDiscoveryService(InetAddress,int,String,String) startDiscoveryService} could be called multiple
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    38
 * times as it stops the running service if it is necessary. Call to {@link #stopDiscoveryService() stopDiscoveryService}
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    39
 * ignored if service isn't run</p>
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    40
 *
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>
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    43
 *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    44
 * <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
    45
 * 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
    46
 * 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
    47
 * lead to security or network issues.
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    48
 * <ul>
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    49
 *     <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
    50
 *     <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
    51
 *     <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
    52
 * </ul>
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    53
  </p>
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    54
 * <p>null parameters values are filtered out on {@link JdpPacketWriter} level and
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    55
 * corresponding keys are not placed to packet.</p>
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    56
 */
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    57
public final class JdpController {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    58
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    59
    private static class JDPControllerRunner implements Runnable {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    60
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    61
        private final JdpJmxPacket packet;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    62
        private final JdpBroadcaster bcast;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    63
        private final int pause;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    64
        private volatile boolean shutdown = false;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    65
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    66
        private JDPControllerRunner(JdpBroadcaster bcast, JdpJmxPacket packet, int pause) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    67
            this.bcast = bcast;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    68
            this.packet = packet;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    69
            this.pause = pause;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    70
        }
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
        @Override
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    73
        public void run() {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    74
            try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    75
                while (!shutdown) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    76
                    bcast.sendPacket(packet);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    77
                    try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    78
                        Thread.sleep(this.pause);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    79
                    } catch (InterruptedException e) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    80
                        // pass
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    81
                    }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    82
                }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    83
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    84
            } catch (IOException e) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    85
              // pass;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    86
            }
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
            // It's not possible to re-use controller,
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    89
            // nevertheless reset shutdown variable
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    90
            try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    91
                stop();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    92
                bcast.shutdown();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    93
            } catch (IOException ex) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    94
                // pass - ignore IOException during shutdown
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
        }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    97
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    98
        public void stop() {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
    99
            shutdown = true;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   100
        }
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
    private static JDPControllerRunner controller = null;
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
    private JdpController(){
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   105
        // Don't allow to instantiate this class.
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
    // Utility to handle optional system properties
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   109
    // 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
   110
    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
   111
        try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   112
            return (val == null) ? dflt : Integer.parseInt(val);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   113
        } catch (NumberFormatException ex) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   114
            throw new JdpException(msg);
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
    }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   117
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   118
    // 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
   119
    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
   120
        try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   121
            return (val == null) ? dflt : InetAddress.getByName(val);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   122
        } catch (UnknownHostException ex) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   123
            throw new JdpException(msg);
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
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   127
    /**
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   128
     * Starts discovery service
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   129
     *
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   130
     * @param address - multicast group address
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   131
     * @param port - udp port to use
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   132
     * @param instanceName - name of running JVM instance
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   133
     * @param url - JMX service url
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   134
     * @throws IOException
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   135
     */
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   136
    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
   137
            throws IOException, JdpException {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   138
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   139
        // Limit packet to local subnet by default
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   140
        int ttl = getInteger(
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   141
                System.getProperty("com.sun.management.jdp.ttl"), 1,
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   142
                "Invalid jdp packet ttl");
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   143
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   144
        // Broadcast once a 5 seconds by default
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   145
        int pause = getInteger(
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   146
                System.getProperty("com.sun.management.jdp.pause"), 5,
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   147
                "Invalid jdp pause");
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   148
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   149
        // Converting seconds to milliseconds
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   150
        pause = pause * 1000;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   151
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   152
        // Allow OS to choose broadcast source
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   153
        InetAddress sourceAddress = getInetAddress(
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   154
                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
   155
                "Invalid source address provided");
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
        // Generate session id
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   158
        UUID id = UUID.randomUUID();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   159
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   160
        JdpJmxPacket packet = new JdpJmxPacket(id, url);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   161
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   162
        // 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
   163
        // Strip everything after first space
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   164
        String javaCommand = System.getProperty("sun.java.command");
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   165
        if (javaCommand != null) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   166
            String[] arr = javaCommand.split(" ", 2);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   167
            packet.setMainClass(arr[0]);
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
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   170
        // 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
   171
        // 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
   172
        packet.setInstanceName(instanceName);
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
        JdpBroadcaster bcast = new JdpBroadcaster(address, sourceAddress, port, ttl);
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
        // Stop discovery service if it's already running
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   177
        stopDiscoveryService();
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
        controller = new JDPControllerRunner(bcast, packet, pause);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   180
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   181
        Thread t = new Thread(controller, "JDP broadcaster");
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   182
        t.setDaemon(true);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   183
        t.start();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   184
    }
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
     * Stop running discovery service,
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   188
     * 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
   189
     */
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   190
    public static synchronized void stopDiscoveryService() {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   191
        if ( controller != null ){
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   192
             controller.stop();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   193
             controller = null;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents:
diff changeset
   194
        }
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
}