Class AbstractConnector
- java.lang.Object
-
- org.eclipse.jetty.util.component.AbstractLifeCycle
-
- org.eclipse.jetty.util.component.ContainerLifeCycle
-
- org.eclipse.jetty.server.AbstractConnector
-
- All Implemented Interfaces:
Connector
,Container
,Destroyable
,Dumpable
,Dumpable.DumpableContainer
,Graceful
,LifeCycle
- Direct Known Subclasses:
AbstractNetworkConnector
,LocalConnector
,UnixSocketConnector
@ManagedObject("Abstract implementation of the Connector Interface") public abstract class AbstractConnector extends ContainerLifeCycle implements Connector, Dumpable
An abstract implementation of
Connector
that provides aConnectionFactory
mechanism for creatingConnection
instances for various protocols (HTTP, SSL, etc).Connector Services
The abstract connector manages the dependent services needed by all specific connector instances:- The
Executor
service is used to run all active tasks needed by this connector such as accepting connections or handle HTTP requests. The default is to use theServer.getThreadPool()
as an executor. - The
Scheduler
service is used to monitor the idle timeouts of all connections and is also made available to the connections to time such things as asynchronous request timeouts. The default is to use a newScheduledExecutorScheduler
instance. - The
ByteBufferPool
service is made available to all connections to be used to acquire and releaseByteBuffer
instances from a pool. The default is to use a newArrayByteBufferPool
instance.
ContainerLifeCycle
super class and may either be managed or unmanaged beans.Connection Factories
The connector keeps a collection ofConnectionFactory
instances, each of which are known by their protocol name. The protocol name may be a real protocol (e.g. "http/1.1" or "h2") or it may be a private name that represents a special connection factory. For example, the name "SSL-http/1.1" is used for anSslConnectionFactory
that has been instantiated with theHttpConnectionFactory
as it's next protocol.Configuring Connection Factories
The collection of availableConnectionFactory
may be constructor injected or modified with the methodsaddConnectionFactory(ConnectionFactory)
,removeConnectionFactory(String)
andsetConnectionFactories(Collection)
. Only a singleConnectionFactory
instance may be configured per protocol name, so if two factories with the sameConnectionFactory.getProtocol()
are set, then the second will replace the first.The protocol factory used for newly accepted connections is specified by the method
setDefaultProtocol(String)
or defaults to the protocol of the first configured factory.Each Connection factory type is responsible for the configuration of the protocols that it accepts. Thus to configure the HTTP protocol, you pass a
HttpConfiguration
instance to theHttpConnectionFactory
(or other factories that can also provide HTTP Semantics). Similarly theSslConnectionFactory
is configured by passing it aSslContextFactory
and a next protocol name.Connection Factory Operation
ConnectionFactory
s may simply create aConnection
instance to support a specific protocol. For example, theHttpConnectionFactory
will create aHttpConnection
instance that can handle http/1.1, http/1.0 and http/0.9.ConnectionFactory
s may also create a chain ofConnection
instances, using otherConnectionFactory
instances. For example, theSslConnectionFactory
is configured with a next protocol name, so that once it has accepted a connection and created anSslConnection
, it then used the nextConnectionFactory
from the connector using thegetConnectionFactory(String)
method, to create aConnection
instance that will handle the unencrypted bytes from theSslConnection
. If the next protocol is "http/1.1", then theSslConnectionFactory
will have a protocol name of "SSL-http/1.1" and lookup "http/1.1" for the protocol to run over the SSL connection.ConnectionFactory
s may also create temporaryConnection
instances that will exchange bytes over the connection to determine what is the next protocol to use. For example the ALPN protocol is an extension of SSL to allow a protocol to be specified during the SSL handshake. ALPN is used by the HTTP/2 protocol to negotiate the protocol that the client and server will speak. Thus to accept an HTTP/2 connection, the connector will be configured withConnectionFactory
s for "SSL-ALPN", "h2", "http/1.1" with the default protocol being "SSL-ALPN". Thus a newly accepted connection uses "SSL-ALPN", which specifies a SSLConnectionFactory with "ALPN" as the next protocol. Thus an SSL connection instance is created chained to an ALPN connection instance. The ALPN connection then negotiates with the client to determined the next protocol, which could be "h2" or the default of "http/1.1". Once the next protocol is determined, the ALPN connection callsgetConnectionFactory(String)
to create a connection instance that will replace the ALPN connection as the connection chained to the SSL connection.Acceptors
The connector will execute a number of acceptor tasks to theException
service passed to the constructor. The acceptor tasks run in a loop while the connector is running and repeatedly call the abstractaccept(int)
method. The implementation of the accept method must:- block waiting for new connections
- accept the connection (eg socket accept)
- perform any configuration of the connection (eg. socket configuration)
- call the
getDefaultConnectionFactory()
ConnectionFactory.newConnection(Connector, org.eclipse.jetty.io.EndPoint)
method to create a new Connection instance.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
AbstractLifeCycle.AbstractLifeCycleListener
-
Nested classes/interfaces inherited from interface org.eclipse.jetty.util.component.Container
Container.InheritedListener, Container.Listener
-
Nested classes/interfaces inherited from interface org.eclipse.jetty.util.component.Dumpable
Dumpable.DumpableContainer
-
Nested classes/interfaces inherited from interface org.eclipse.jetty.util.component.Graceful
Graceful.Shutdown
-
Nested classes/interfaces inherited from interface org.eclipse.jetty.util.component.LifeCycle
LifeCycle.Listener
-
-
Constructor Summary
Constructors Constructor Description AbstractConnector(Server server, java.util.concurrent.Executor executor, Scheduler scheduler, ByteBufferPool pool, int acceptors, ConnectionFactory... factories)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected abstract void
accept(int acceptorID)
void
addConnectionFactory(ConnectionFactory factory)
void
addFirstConnectionFactory(ConnectionFactory factory)
void
addIfAbsentConnectionFactory(ConnectionFactory factory)
void
clearConnectionFactories()
protected void
doStart()
Starts the managed lifecycle beans in the order they were added.protected void
doStop()
Stops the managed lifecycle beans in the reverse order they were added.int
getAcceptorPriorityDelta()
int
getAcceptors()
ByteBufferPool
getByteBufferPool()
java.util.Collection<EndPoint>
getConnectedEndPoints()
java.util.Collection<ConnectionFactory>
getConnectionFactories()
<T> T
getConnectionFactory(java.lang.Class<T> factoryType)
ConnectionFactory
getConnectionFactory(java.lang.String protocol)
ConnectionFactory
getDefaultConnectionFactory()
java.lang.String
getDefaultProtocol()
java.util.concurrent.Executor
getExecutor()
HttpChannel.Listener
getHttpChannelListeners()
Get theHttpChannel.Listener
s added to the connector as a single combined Listener.long
getIdleTimeout()
java.lang.String
getName()
Get the connector name if set.java.util.List<java.lang.String>
getProtocols()
Scheduler
getScheduler()
Server
getServer()
protected boolean
handleAcceptFailure(java.lang.Throwable ex)
protected void
interruptAcceptors()
boolean
isAccepting()
boolean
isShutdown()
void
join()
void
join(long timeout)
protected void
onEndPointClosed(EndPoint endp)
protected void
onEndPointOpened(EndPoint endp)
ConnectionFactory
removeConnectionFactory(java.lang.String protocol)
void
setAccepting(boolean accepting)
void
setAcceptorPriorityDelta(int acceptorPriorityDelta)
Set the acceptor thread priority delta.void
setConnectionFactories(java.util.Collection<ConnectionFactory> factories)
void
setDefaultProtocol(java.lang.String defaultProtocol)
void
setIdleTimeout(long idleTimeout)
Sets the maximum Idle time for a connection, which roughly translates to theSocket.setSoTimeout(int)
call, although with NIO implementations other mechanisms may be used to implement the timeout.void
setName(java.lang.String name)
Set a connector name.java.util.concurrent.Future<java.lang.Void>
shutdown()
java.lang.String
toString()
-
Methods inherited from class org.eclipse.jetty.util.component.ContainerLifeCycle
addBean, addBean, addEventListener, addManaged, contains, destroy, dump, dump, dump, dump, dump, dumpBeans, dumpObject, dumpObjects, dumpStdErr, dumpThis, getBean, getBeans, getBeans, getContainedBeans, getContainedBeans, isAuto, isManaged, isUnmanaged, manage, removeBean, removeBeans, removeEventListener, setBeans, setStopTimeout, start, stop, unmanage, updateBean, updateBean, updateBeans
-
Methods inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
addLifeCycleListener, getState, getState, getStopTimeout, isFailed, isRunning, isStarted, isStarting, isStopped, isStopping, removeLifeCycleListener, start, stop
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.eclipse.jetty.server.Connector
getTransport
-
Methods inherited from interface org.eclipse.jetty.util.component.Container
addBean, addBean, addEventListener, getBean, getBeans, getBeans, getContainedBeans, isManaged, manage, removeBean, removeEventListener, unmanage
-
Methods inherited from interface org.eclipse.jetty.util.component.Dumpable.DumpableContainer
isDumpable
-
Methods inherited from interface org.eclipse.jetty.util.component.LifeCycle
addLifeCycleListener, isFailed, isRunning, isStarted, isStarting, isStopped, isStopping, removeLifeCycleListener, start, stop
-
-
-
-
Field Detail
-
LOG
protected static final Logger LOG
-
-
Constructor Detail
-
AbstractConnector
public AbstractConnector(Server server, java.util.concurrent.Executor executor, Scheduler scheduler, ByteBufferPool pool, int acceptors, ConnectionFactory... factories)
- Parameters:
server
- The server this connector will be added to. Must not be null.executor
- An executor for this connector or null to use the servers executorscheduler
- A scheduler for this connector or null to either aScheduler
set as a server bean or if none set, then a newScheduledExecutorScheduler
instance.pool
- A buffer pool for this connector or null to either aByteBufferPool
set as a server bean or none set, the newArrayByteBufferPool
instance.acceptors
- the number of acceptor threads to use, or -1 for a default value. If 0, then no acceptor threads will be launched and some other mechanism will need to be used to accept new connections.factories
- The Connection Factories to use.
-
-
Method Detail
-
getHttpChannelListeners
public HttpChannel.Listener getHttpChannelListeners()
Get theHttpChannel.Listener
s added to the connector as a single combined Listener. This is equivalent to a listener that iterates over the individual listeners returned fromgetBeans(HttpChannel.Listener.class);
, except that:- The result is precomputed, so it is more efficient
- The result is ordered by the order added.
- The result is immutable.
- Returns:
- An unmodifiable list of EventListener beans
- See Also:
ContainerLifeCycle.getBeans(Class)
-
getServer
public Server getServer()
-
getExecutor
public java.util.concurrent.Executor getExecutor()
- Specified by:
getExecutor
in interfaceConnector
- Returns:
- the
Executor
used to submit tasks
-
getByteBufferPool
public ByteBufferPool getByteBufferPool()
- Specified by:
getByteBufferPool
in interfaceConnector
- Returns:
- the
ByteBufferPool
to acquire buffers from and release buffers to
-
getIdleTimeout
@ManagedAttribute("The connection idle timeout in milliseconds") public long getIdleTimeout()
- Specified by:
getIdleTimeout
in interfaceConnector
- Returns:
- the max idle timeout for connections in milliseconds
-
setIdleTimeout
public void setIdleTimeout(long idleTimeout)
Sets the maximum Idle time for a connection, which roughly translates to the
Socket.setSoTimeout(int)
call, although with NIO implementations other mechanisms may be used to implement the timeout.The max idle time is applied:
- When waiting for a new message to be received on a connection
- When waiting for a new message to be sent on a connection
This value is interpreted as the maximum time between some progress being made on the connection. So if a single byte is read or written, then the timeout is reset.
- Parameters:
idleTimeout
- the idle timeout
-
getAcceptors
@ManagedAttribute("number of acceptor threads") public int getAcceptors()
- Returns:
- Returns the number of acceptor threads.
-
doStart
protected void doStart() throws java.lang.Exception
Description copied from class:ContainerLifeCycle
Starts the managed lifecycle beans in the order they were added.- Overrides:
doStart
in classContainerLifeCycle
- Throws:
java.lang.Exception
-
interruptAcceptors
protected void interruptAcceptors()
-
shutdown
public java.util.concurrent.Future<java.lang.Void> shutdown()
-
isShutdown
public boolean isShutdown()
- Specified by:
isShutdown
in interfaceGraceful
-
doStop
protected void doStop() throws java.lang.Exception
Description copied from class:ContainerLifeCycle
Stops the managed lifecycle beans in the reverse order they were added.- Overrides:
doStop
in classContainerLifeCycle
- Throws:
java.lang.Exception
-
join
public void join() throws java.lang.InterruptedException
- Throws:
java.lang.InterruptedException
-
join
public void join(long timeout) throws java.lang.InterruptedException
- Throws:
java.lang.InterruptedException
-
accept
protected abstract void accept(int acceptorID) throws java.io.IOException, java.lang.InterruptedException
- Throws:
java.io.IOException
java.lang.InterruptedException
-
isAccepting
public boolean isAccepting()
- Returns:
- Is the connector accepting new connections
-
setAccepting
public void setAccepting(boolean accepting)
-
getConnectionFactory
public ConnectionFactory getConnectionFactory(java.lang.String protocol)
- Specified by:
getConnectionFactory
in interfaceConnector
- Parameters:
protocol
- the next protocol- Returns:
- the
ConnectionFactory
associated with the protocol name
-
getConnectionFactory
public <T> T getConnectionFactory(java.lang.Class<T> factoryType)
- Specified by:
getConnectionFactory
in interfaceConnector
-
addConnectionFactory
public void addConnectionFactory(ConnectionFactory factory)
-
addFirstConnectionFactory
public void addFirstConnectionFactory(ConnectionFactory factory)
-
addIfAbsentConnectionFactory
public void addIfAbsentConnectionFactory(ConnectionFactory factory)
-
removeConnectionFactory
public ConnectionFactory removeConnectionFactory(java.lang.String protocol)
-
getConnectionFactories
public java.util.Collection<ConnectionFactory> getConnectionFactories()
- Specified by:
getConnectionFactories
in interfaceConnector
-
setConnectionFactories
public void setConnectionFactories(java.util.Collection<ConnectionFactory> factories)
-
getAcceptorPriorityDelta
@ManagedAttribute("The priority delta to apply to acceptor threads") public int getAcceptorPriorityDelta()
-
setAcceptorPriorityDelta
public void setAcceptorPriorityDelta(int acceptorPriorityDelta)
Set the acceptor thread priority delta.This allows the acceptor thread to run at a different priority. Typically this would be used to lower the priority to give preference to handling previously accepted connections rather than accepting new connections
- Parameters:
acceptorPriorityDelta
- the acceptor priority delta
-
getProtocols
@ManagedAttribute("Protocols supported by this connector") public java.util.List<java.lang.String> getProtocols()
- Specified by:
getProtocols
in interfaceConnector
-
clearConnectionFactories
public void clearConnectionFactories()
-
getDefaultProtocol
@ManagedAttribute("This connector\'s default protocol") public java.lang.String getDefaultProtocol()
-
setDefaultProtocol
public void setDefaultProtocol(java.lang.String defaultProtocol)
-
getDefaultConnectionFactory
public ConnectionFactory getDefaultConnectionFactory()
- Specified by:
getDefaultConnectionFactory
in interfaceConnector
- Returns:
- the default
ConnectionFactory
associated with the default protocol name
-
handleAcceptFailure
protected boolean handleAcceptFailure(java.lang.Throwable ex)
-
getConnectedEndPoints
public java.util.Collection<EndPoint> getConnectedEndPoints()
- Specified by:
getConnectedEndPoints
in interfaceConnector
- Returns:
- immutable collection of connected endpoints
-
onEndPointOpened
protected void onEndPointOpened(EndPoint endp)
-
onEndPointClosed
protected void onEndPointClosed(EndPoint endp)
-
getScheduler
public Scheduler getScheduler()
- Specified by:
getScheduler
in interfaceConnector
- Returns:
- the
Scheduler
used to schedule tasks
-
getName
public java.lang.String getName()
Description copied from interface:Connector
Get the connector name if set.A
ContextHandler
may be configured with virtual hosts in the form "@connectorName" and will only serve requests from the named connector.
-
setName
public void setName(java.lang.String name)
Set a connector name. A context may be configured with virtual hosts in the form "@contextname" and will only serve requests from the named connector,- Parameters:
name
- A connector name.
-
toString
public java.lang.String toString()
- Overrides:
toString
in classAbstractLifeCycle
-
-