Class NGServer

java.lang.Object
com.martiansoftware.nailgun.NGServer
All Implemented Interfaces:
Runnable

public class NGServer extends Object implements Runnable

Listens for new connections from NailGun clients and launches NGSession threads to process them.

This class can be run as a standalone server or can be embedded within larger applications as a means of providing command-line interaction with the application.

  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    private static class 
    A shutdown hook that will cleanly bring down the NGServer if it is interrupted.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private final AliasManager
    This NGServer's AliasManager, which maps aliases to classes
    private final Map
    a collection of all classes executed by this server so far
    private boolean
    If true, fully-qualified classnames are valid commands
    static final int
    Default size for thread pool
    private Class
    The default class to use if an invalid alias or classname is specified by the client.
    System.err at the time of the NGServer's creation
    private final int
     
    System.in at the time of the NGServer's creation
    private final NGListeningAddress
    The address on which to listen
    Remember the security manager we start with so we can restore it later
    System.out at the time of the NGServer's creation
    private final AtomicBoolean
    True if this NGServer has been started and is accepting connections
    private ServerSocket
    The socket doing the listening
    private final NGSessionPool
    A pool of NGSessions ready to handle client connections
    private final AtomicBoolean
    True if this NGServer has received instructions to shut down
  • Constructor Summary

    Constructors
    Constructor
    Description
    Creates a new NGServer that will listen on the default port (defined in NGConstants.DEFAULT_PORT).
    NGServer(NGListeningAddress listeningAddress, int sessionPoolSize, int timeoutMillis)
    Creates a new NGServer that will listen at the specified address and on the specified port with the specified session pool size.
    NGServer(InetAddress addr, int port)
    Creates a new NGServer that will listen at the specified address and on the specified port with the default session pool size.
    NGServer(InetAddress addr, int port, int sessionPoolSize, int timeoutMillis)
    Creates a new NGServer that will listen at the specified address and on the specified port with the specified session pool size.
  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    Returns a flag that indicates whether Nail lookups by classname are allowed.
    Returns the AliasManager in use by this NGServer.
    Returns the default class that will be used if no Nails can be found via alias or classname.
    int
     
    Returns a snapshot of this NGServer's nail statistics.
    private NailStats
    Returns the current NailStats object for the specified class, creating a new one if necessary
    int
    Returns the port on which this server is (or will be) listening.
    boolean
    Returns true iff the server is currently running.
    static void
    main(String[] args)
    Creates and starts a new NGServer.
    (package private) void
    nailFinished(Class nailClass)
    Provides a means for an NGSession to register the completion of a nails execution with the server.
    (package private) void
    nailStarted(Class nailClass)
    Provides a means for an NGSession to register the starting of a nail execution with the server.
    void
    run()
    Listens for new connections and launches NGSession threads to process them.
    void
    setAllowNailsByClassName(boolean allowNailsByClassName)
    Sets a flag that determines whether Nails can be executed by class name.
    void
    setDefaultNailClass(Class defaultNailClass)
    Sets the default class to use for the Nail if no Nails can be found via alias or classname.
    void
    shutdown(boolean exitVM)
    Shuts down the server.
    private static void
     

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • DEFAULT_SESSIONPOOLSIZE

      public static final int DEFAULT_SESSIONPOOLSIZE
      Default size for thread pool
      See Also:
    • listeningAddress

      private final NGListeningAddress listeningAddress
      The address on which to listen
    • serversocket

      private ServerSocket serversocket
      The socket doing the listening
    • shutdown

      private final AtomicBoolean shutdown
      True if this NGServer has received instructions to shut down
    • running

      private final AtomicBoolean running
      True if this NGServer has been started and is accepting connections
    • aliasManager

      private final AliasManager aliasManager
      This NGServer's AliasManager, which maps aliases to classes
    • allowNailsByClassName

      private boolean allowNailsByClassName
      If true, fully-qualified classnames are valid commands
    • defaultNailClass

      private Class defaultNailClass
      The default class to use if an invalid alias or classname is specified by the client.
    • sessionPool

      private final NGSessionPool sessionPool
      A pool of NGSessions ready to handle client connections
    • out

      public final PrintStream out
      System.out at the time of the NGServer's creation
    • err

      public final PrintStream err
      System.err at the time of the NGServer's creation
    • in

      public final InputStream in
      System.in at the time of the NGServer's creation
    • allNailStats

      private final Map allNailStats
      a collection of all classes executed by this server so far
    • originalSecurityManager

      private SecurityManager originalSecurityManager
      Remember the security manager we start with so we can restore it later
    • heartbeatTimeoutMillis

      private final int heartbeatTimeoutMillis
  • Constructor Details

    • NGServer

      public NGServer(InetAddress addr, int port, int sessionPoolSize, int timeoutMillis)
      Creates a new NGServer that will listen at the specified address and on the specified port with the specified session pool size. This does not cause the server to start listening. To do so, create a new Thread wrapping this NGServer and start it.
      Parameters:
      addr - the address at which to listen, or null to bind to all local addresses
      port - the port on which to listen.
      sessionPoolSize - the max number of idle sessions allowed by the pool
    • NGServer

      public NGServer(InetAddress addr, int port)
      Creates a new NGServer that will listen at the specified address and on the specified port with the default session pool size. This does not cause the server to start listening. To do so, create a new Thread wrapping this NGServer and start it.
      Parameters:
      addr - the address at which to listen, or null to bind to all local addresses
      port - the port on which to listen.
    • NGServer

      public NGServer()
      Creates a new NGServer that will listen on the default port (defined in NGConstants.DEFAULT_PORT). This does not cause the server to start listening. To do so, create a new Thread wrapping this NGServer and start it.
    • NGServer

      public NGServer(NGListeningAddress listeningAddress, int sessionPoolSize, int timeoutMillis)
      Creates a new NGServer that will listen at the specified address and on the specified port with the specified session pool size. This does not cause the server to start listening. To do so, create a new Thread wrapping this NGServer and start it.
      Parameters:
      listeningAddress - the address at which to listen
      sessionPoolSize - the max number of idle sessions allowed by the pool
      timeoutMillis - timeout in millis to wait for a heartbeat from the client before disconnecting them
  • Method Details

    • setAllowNailsByClassName

      public void setAllowNailsByClassName(boolean allowNailsByClassName)
      Sets a flag that determines whether Nails can be executed by class name. If this is false, Nails can only be run via aliases (and you should probably remove ng-alias from the AliasManager).
      Parameters:
      allowNailsByClassName - true iff Nail lookups by classname are allowed
    • allowsNailsByClassName

      public boolean allowsNailsByClassName()
      Returns a flag that indicates whether Nail lookups by classname are allowed. If this is false, Nails can only be run via aliases.
      Returns:
      a flag that indicates whether Nail lookups by classname are allowed.
    • setDefaultNailClass

      public void setDefaultNailClass(Class defaultNailClass)
      Sets the default class to use for the Nail if no Nails can be found via alias or classname. (may be null, in which case NailGun will use its own default)
      Parameters:
      defaultNailClass - the default class to use for the Nail if no Nails can be found via alias or classname. (may be null, in which case NailGun will use its own default)
    • getDefaultNailClass

      public Class getDefaultNailClass()
      Returns the default class that will be used if no Nails can be found via alias or classname.
      Returns:
      the default class that will be used if no Nails can be found via alias or classname.
    • getOrCreateStatsFor

      private NailStats getOrCreateStatsFor(Class nailClass)
      Returns the current NailStats object for the specified class, creating a new one if necessary
      Parameters:
      nailClass - the class for which we're gathering stats
      Returns:
      a NailStats object for the specified class
    • nailStarted

      void nailStarted(Class nailClass)
      Provides a means for an NGSession to register the starting of a nail execution with the server.
      Parameters:
      nailClass - the nail class that was launched
    • nailFinished

      void nailFinished(Class nailClass)
      Provides a means for an NGSession to register the completion of a nails execution with the server.
      Parameters:
      nailClass - the nail class that finished
    • getNailStats

      public Map getNailStats()
      Returns a snapshot of this NGServer's nail statistics. The result is a java.util.Map, keyed by class name, with NailStats objects as values.
      Returns:
      a snapshot of this NGServer's nail statistics.
    • getAliasManager

      public AliasManager getAliasManager()
      Returns the AliasManager in use by this NGServer.
      Returns:
      the AliasManager in use by this NGServer.
    • shutdown

      public void shutdown(boolean exitVM)

      Shuts down the server. The server will stop listening and its thread will finish. Any running nails will be allowed to finish.

      Any nails that provide a

      public static void nailShutdown(NGServer)
      method will have this method called with this NGServer as its sole parameter.

      Parameters:
      exitVM - if true, this method will also exit the JVM after calling nailShutdown() on any nails. This may prevent currently running nails from exiting gracefully, but may be necessary in order to perform some tasks, such as shutting down any AWT or Swing threads implicitly launched by your nails.
    • isRunning

      public boolean isRunning()
      Returns true iff the server is currently running.
      Returns:
      true iff the server is currently running.
    • getPort

      public int getPort()
      Returns the port on which this server is (or will be) listening.
      Returns:
      the port on which this server is (or will be) listening.
    • run

      public void run()
      Listens for new connections and launches NGSession threads to process them.
      Specified by:
      run in interface Runnable
    • usage

      private static void usage()
    • main

      public static void main(String[] args) throws NumberFormatException, UnknownHostException
      Creates and starts a new NGServer. A single optional argument is valid, specifying the port on which this NGServer should listen. If omitted, NGServer.DEFAULT_PORT will be used.
      Parameters:
      args - a single optional argument specifying the port on which to listen.
      Throws:
      NumberFormatException - if a non-numeric port is specified
      UnknownHostException
    • getHeartbeatTimeout

      public int getHeartbeatTimeout()