Package com.martiansoftware.nailgun
Class NGServer
- java.lang.Object
-
- com.martiansoftware.nailgun.NGServer
-
- All Implemented Interfaces:
java.lang.Runnable
public class NGServer extends java.lang.Object implements java.lang.RunnableListens 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 classNGServer.NGServerShutdownerA shutdown hook that will cleanly bring down the NGServer if it is interrupted.
-
Field Summary
Fields Modifier and Type Field Description private AliasManageraliasManagerThis NGServer's AliasManager, which maps aliases to classesprivate java.util.MapallNailStatsa collection of all classes executed by this server so farprivate booleanallowNailsByClassNameIf true, fully-qualified classnames are valid commandsstatic intDEFAULT_SESSIONPOOLSIZEDefault size for thread poolprivate java.lang.ClassdefaultNailClassThe default class to use if an invalid alias or classname is specified by the client.java.io.PrintStreamerrSystem.errat the time of the NGServer's creationprivate intheartbeatTimeoutMillisjava.io.InputStreaminSystem.inat the time of the NGServer's creationprivate NGListeningAddresslisteningAddressThe address on which to listenprivate java.lang.SecurityManageroriginalSecurityManagerRemember the security manager we start with so we can restore it laterjava.io.PrintStreamoutSystem.outat the time of the NGServer's creationprivate java.util.concurrent.atomic.AtomicBooleanrunningTrue if this NGServer has been started and is accepting connectionsprivate java.net.ServerSocketserversocketThe socket doing the listeningprivate NGSessionPoolsessionPoolA pool of NGSessions ready to handle client connectionsprivate java.util.concurrent.atomic.AtomicBooleanshutdownTrue if this NGServer has received instructions to shut down
-
Constructor Summary
Constructors Constructor Description NGServer()Creates a new NGServer that will listen on the default port (defined inNGConstants.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(java.net.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(java.net.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
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description booleanallowsNailsByClassName()Returns a flag that indicates whether Nail lookups by classname are allowed.AliasManagergetAliasManager()Returns the AliasManager in use by this NGServer.java.lang.ClassgetDefaultNailClass()Returns the default class that will be used if no Nails can be found via alias or classname.intgetHeartbeatTimeout()java.util.MapgetNailStats()Returns a snapshot of this NGServer's nail statistics.private NailStatsgetOrCreateStatsFor(java.lang.Class nailClass)Returns the current NailStats object for the specified class, creating a new one if necessaryintgetPort()Returns the port on which this server is (or will be) listening.booleanisRunning()Returns true iff the server is currently running.static voidmain(java.lang.String[] args)Creates and starts a newNGServer.(package private) voidnailFinished(java.lang.Class nailClass)Provides a means for an NGSession to register the completion of a nails execution with the server.(package private) voidnailStarted(java.lang.Class nailClass)Provides a means for an NGSession to register the starting of a nail execution with the server.voidrun()Listens for new connections and launches NGSession threads to process them.voidsetAllowNailsByClassName(boolean allowNailsByClassName)Sets a flag that determines whether Nails can be executed by class name.voidsetDefaultNailClass(java.lang.Class defaultNailClass)Sets the default class to use for the Nail if no Nails can be found via alias or classname.voidshutdown(boolean exitVM)Shuts down the server.private static voidusage()
-
-
-
Field Detail
-
DEFAULT_SESSIONPOOLSIZE
public static final int DEFAULT_SESSIONPOOLSIZE
Default size for thread pool- See Also:
- Constant Field Values
-
listeningAddress
private final NGListeningAddress listeningAddress
The address on which to listen
-
serversocket
private java.net.ServerSocket serversocket
The socket doing the listening
-
shutdown
private final java.util.concurrent.atomic.AtomicBoolean shutdown
True if this NGServer has received instructions to shut down
-
running
private final java.util.concurrent.atomic.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 java.lang.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 java.io.PrintStream out
System.outat the time of the NGServer's creation
-
err
public final java.io.PrintStream err
System.errat the time of the NGServer's creation
-
in
public final java.io.InputStream in
System.inat the time of the NGServer's creation
-
allNailStats
private final java.util.Map allNailStats
a collection of all classes executed by this server so far
-
originalSecurityManager
private java.lang.SecurityManager originalSecurityManager
Remember the security manager we start with so we can restore it later
-
heartbeatTimeoutMillis
private final int heartbeatTimeoutMillis
-
-
Constructor Detail
-
NGServer
public NGServer(java.net.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 newThreadwrapping thisNGServerand start it.- Parameters:
addr- the address at which to listen, ornullto bind to all local addressesport- the port on which to listen.sessionPoolSize- the max number of idle sessions allowed by the pool
-
NGServer
public NGServer(java.net.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 newThreadwrapping thisNGServerand start it.- Parameters:
addr- the address at which to listen, ornullto bind to all local addressesport- the port on which to listen.
-
NGServer
public NGServer()
Creates a new NGServer that will listen on the default port (defined inNGConstants.DEFAULT_PORT). This does not cause the server to start listening. To do so, create a newThreadwrapping thisNGServerand 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 newThreadwrapping thisNGServerand start it.- Parameters:
listeningAddress- the address at which to listensessionPoolSize- the max number of idle sessions allowed by the pooltimeoutMillis- timeout in millis to wait for a heartbeat from the client before disconnecting them
-
-
Method Detail
-
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(java.lang.Class defaultNailClass)
Sets the default class to use for the Nail if no Nails can be found via alias or classname. (may benull, 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 benull, in which case NailGun will use its own default)
-
getDefaultNailClass
public java.lang.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(java.lang.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(java.lang.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(java.lang.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 java.util.Map getNailStats()
Returns a snapshot of this NGServer's nail statistics. The result is ajava.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
method will have this method called with this NGServer as its sole parameter.public static void nailShutdown(NGServer)- 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:
runin interfacejava.lang.Runnable
-
usage
private static void usage()
-
main
public static void main(java.lang.String[] args) throws java.lang.NumberFormatException, java.net.UnknownHostExceptionCreates and starts a newNGServer. A single optional argument is valid, specifying the port on which thisNGServershould listen. If omitted,NGServer.DEFAULT_PORTwill be used.- Parameters:
args- a single optional argument specifying the port on which to listen.- Throws:
java.lang.NumberFormatException- if a non-numeric port is specifiedjava.net.UnknownHostException
-
getHeartbeatTimeout
public int getHeartbeatTimeout()
-
-