Class TransportImpl
java.lang.Object
org.apache.qpid.proton.engine.impl.EndpointImpl
org.apache.qpid.proton.engine.impl.TransportImpl
- All Implemented Interfaces:
FrameBody.FrameBodyHandler<Integer>
,Endpoint
,Extendable
,FrameHandler
,TransportInternal
,ProtonJEndpoint
,ProtonJTransport
,Transport
public class TransportImpl
extends EndpointImpl
implements ProtonJTransport, FrameBody.FrameBodyHandler<Integer>, FrameHandler, TransportInternal
-
Nested Class Summary
Nested classes/interfaces inherited from interface org.apache.qpid.proton.engine.Transport
Transport.Factory
-
Field Summary
Fields inherited from interface org.apache.qpid.proton.engine.Transport
DEFAULT_MAX_FRAME_SIZE, END_OF_STREAM, MIN_MAX_FRAME_SIZE, SESSION_WINDOW, TRACE_DRV, TRACE_FRM, TRACE_OFF, TRACE_RAW
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid
addTransportLayer
(TransportLayer layer) Add aTransportLayer
to the transport, wrapping the input and output process handlers in the state they currently exist.void
bind
(Connection conn) int
capacity()
void
void
void
closed
(TransportException error) int
Gets the local channel-max value to be advertised to the remote peerprotected ConnectionImpl
long
long
int
Get a buffer that can be used to write input data into the transport.int
Get the maximum frame size for the transportint
Get a read-only byte buffer containing the transport's pending output.int
Gets the remote value of channel-max, as advertised by the peer on its Open frame.int
int
void
handleAttach
(Attach attach, Binary payload, Integer channel) void
handleBegin
(Begin begin, Binary payload, Integer channel) void
handleClose
(Close close, Binary payload, Integer channel) void
handleDetach
(Detach detach, Binary payload, Integer channel) void
handleDisposition
(Disposition disposition, Binary payload, Integer channel) void
void
handleFlow
(Flow flow, Binary payload, Integer channel) boolean
handleFrame
(TransportFrame frame) void
handleOpen
(Open open, Binary payload, Integer channel) void
handleTransfer
(Transfer transfer, Binary payload, Integer channel) head()
int
input
(byte[] bytes, int offset, int length) Processes the provided input.boolean
isClosed()
boolean
boolean
Returns whether I am currently able to handle frames.boolean
oldApiCheckStateBeforeInput
(int inputLength) This method is public as it is used by Python layer.int
output
(byte[] bytes, int offset, int size) Has the transport produce up to size bytes placing the result into dest beginning at position offset.void
Informs the transport that the output buffer returned byTransport.getOutputBuffer()
is finished with, allowing implementation-dependent steps to be performed such as reclaiming buffer space.int
pending()
void
pop
(int bytes) void
process()
Tell the transport to process the data written to the input buffer.sasl()
Signal the transport to expect SASL frames used to establish a SASL layer prior to performing the AMQP protocol version negotiation.void
setChannelMax
(int channelMax) Set the local value of channel-max, to be advertised to the peer on the Open frame emitted by the transport.void
setCondition
(ErrorCondition error) Set the local error conditionvoid
setEmitFlowEventOnSend
(boolean emitFlowEventOnSend) Configure whether a synthetic Flow event should be emitted when messages are sent, reflecting a change in the credit level on the link that may prompt other action.void
setFrameHandler
(FrameHandler frameHandler) Override the default frame handler.void
setIdleTimeout
(int timeout) void
setInitialRemoteMaxFrameSize
(int remoteMaxFrameSize) Allows overriding the initial remote-max-frame-size to a value greater than the default 512bytes.void
setMaxFrameSize
(int maxFrameSize) void
setOutboundFrameSizeLimit
(int limit) Set an upper limit on the size of outgoing frames that will be sent to the peer.void
setProtocolTracer
(ProtocolTracer protocolTracer) void
setReactor
(Reactor reactor) void
setSelectable
(Selectable selectable) void
setUseReadOnlyOutputBuffer
(boolean value) Equivalent toTransport.ssl(SslDomain, SslPeerDetails)
but passing null for SslPeerDetails, meaning no SNI detail is sent, hostname verification isn't supported etc when connecting.ssl
(SslDomain sslDomain, SslPeerDetails sslPeerDetails) Wrap this transport's output and input to apply SSL encryption and decryption respectively.tail()
long
tick
(long now) Prompt the transport to perform work such as idle-timeout/heartbeat handling, and return an absolute deadline in milliseconds that tick must again be called by/at, based on the provided current time in milliseconds, to ensure the periodic work is carried out as necessary.toString()
void
trace
(int levels) void
unbind()
protected void
writeFrame
(int channel, FrameBody frameBody, ReadableBuffer payload, Runnable onPayloadTooLarge) boolean
writeInto
(ByteBuffer outputBuffer) Methods inherited from class org.apache.qpid.proton.engine.impl.EndpointImpl
attachments, close, free, getContext, getLocalState, getRemoteCondition, getRemoteState, open, setContext
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Methods inherited from interface org.apache.qpid.proton.engine.Endpoint
close, free, getContext, getLocalState, getRemoteCondition, getRemoteState, open, setContext
Methods inherited from interface org.apache.qpid.proton.engine.Extendable
attachments
-
Constructor Details
-
TransportImpl
public TransportImpl()Application code should useTransport.Factory.create()
instead
-
-
Method Details
-
trace
public void trace(int levels) -
getMaxFrameSize
public int getMaxFrameSize()Description copied from interface:Transport
Get the maximum frame size for the transport- Specified by:
getMaxFrameSize
in interfaceTransport
- Returns:
- the maximum frame size
-
getRemoteMaxFrameSize
public int getRemoteMaxFrameSize()- Specified by:
getRemoteMaxFrameSize
in interfaceTransport
-
setInitialRemoteMaxFrameSize
public void setInitialRemoteMaxFrameSize(int remoteMaxFrameSize) Description copied from interface:Transport
Allows overriding the initial remote-max-frame-size to a value greater than the default 512bytes. The value set will be used until such time as the Open frame arrives from the peer and populates the remote max frame size. This method must be called before beforeTransport.sasl()
in order to influence SASL behaviour.- Specified by:
setInitialRemoteMaxFrameSize
in interfaceTransport
- Parameters:
remoteMaxFrameSize
- the remote frame size to use
-
setMaxFrameSize
public void setMaxFrameSize(int maxFrameSize) - Specified by:
setMaxFrameSize
in interfaceTransport
-
getChannelMax
public int getChannelMax()Description copied from interface:Transport
Gets the local channel-max value to be advertised to the remote peer- Specified by:
getChannelMax
in interfaceTransport
- Returns:
- the local channel-max value
- See Also:
-
setChannelMax
public void setChannelMax(int channelMax) Description copied from interface:Transport
Set the local value of channel-max, to be advertised to the peer on the Open frame emitted by the transport. The remote peers advertised channel-max can be observed usingTransport.getRemoteChannelMax()
.- Specified by:
setChannelMax
in interfaceTransport
- Parameters:
channelMax
- the local channel-max to advertise to the peer, in range [0 - 2^16).
-
getRemoteChannelMax
public int getRemoteChannelMax()Description copied from interface:Transport
Gets the remote value of channel-max, as advertised by the peer on its Open frame. The local peers advertised channel-max can be observed usingTransport.getChannelMax()
.- Specified by:
getRemoteChannelMax
in interfaceTransport
- Returns:
- the remote channel-max value
-
getCondition
- Specified by:
getCondition
in interfaceEndpoint
- Specified by:
getCondition
in interfaceTransport
- Overrides:
getCondition
in classEndpointImpl
- Returns:
- the local endpoint error, or null if there is none
-
setCondition
Description copied from interface:Endpoint
Set the local error condition- Specified by:
setCondition
in interfaceEndpoint
- Overrides:
setCondition
in classEndpointImpl
- Parameters:
error
-
-
bind
-
unbind
public void unbind() -
input
public int input(byte[] bytes, int offset, int length) Description copied from interface:Transport
Processes the provided input. -
oldApiCheckStateBeforeInput
This method is public as it is used by Python layer.- See Also:
-
output
public int output(byte[] bytes, int offset, int size) Description copied from interface:Transport
Has the transport produce up to size bytes placing the result into dest beginning at position offset. -
writeInto
-
sasl
Description copied from interface:Transport
Signal the transport to expect SASL frames used to establish a SASL layer prior to performing the AMQP protocol version negotiation. This must first be performed before the transport is used for processing. Subsequent invocations will return the sameSasl
object. -
ssl
Wrap this transport's output and input to apply SSL encryption and decryption respectively. This method is expected to be called at most once. A subsequent invocation will return the sameSsl
object, regardless of the parameters supplied.Note that sslDomain must implement
ProtonSslEngineProvider
. This is not possible enforce at the API level becauseProtonSslEngineProvider
is not part of the public Proton API. -
ssl
Description copied from interface:Transport
Equivalent toTransport.ssl(SslDomain, SslPeerDetails)
but passing null for SslPeerDetails, meaning no SNI detail is sent, hostname verification isn't supported etc when connecting. -
writeFrame
protected void writeFrame(int channel, FrameBody frameBody, ReadableBuffer payload, Runnable onPayloadTooLarge) -
getConnectionImpl
- Specified by:
getConnectionImpl
in classEndpointImpl
-
handleOpen
- Specified by:
handleOpen
in interfaceFrameBody.FrameBodyHandler<Integer>
-
handleBegin
- Specified by:
handleBegin
in interfaceFrameBody.FrameBodyHandler<Integer>
-
handleAttach
- Specified by:
handleAttach
in interfaceFrameBody.FrameBodyHandler<Integer>
-
handleFlow
- Specified by:
handleFlow
in interfaceFrameBody.FrameBodyHandler<Integer>
-
handleTransfer
- Specified by:
handleTransfer
in interfaceFrameBody.FrameBodyHandler<Integer>
-
handleDisposition
- Specified by:
handleDisposition
in interfaceFrameBody.FrameBodyHandler<Integer>
-
handleDetach
- Specified by:
handleDetach
in interfaceFrameBody.FrameBodyHandler<Integer>
-
handleEnd
- Specified by:
handleEnd
in interfaceFrameBody.FrameBodyHandler<Integer>
-
handleClose
- Specified by:
handleClose
in interfaceFrameBody.FrameBodyHandler<Integer>
-
handleFrame
- Specified by:
handleFrame
in interfaceFrameHandler
- Returns:
- false on end of stream
- See Also:
-
closed
- Specified by:
closed
in interfaceFrameHandler
-
isHandlingFrames
public boolean isHandlingFrames()Description copied from interface:FrameHandler
Returns whether I am currently able to handle frames. MUST be checked before callingFrameHandler.handleFrame(TransportFrame)
.- Specified by:
isHandlingFrames
in interfaceFrameHandler
-
getProtocolTracer
- Specified by:
getProtocolTracer
in interfaceProtonJTransport
-
setProtocolTracer
- Specified by:
setProtocolTracer
in interfaceProtonJTransport
-
getInputBuffer
Description copied from interface:Transport
Get a buffer that can be used to write input data into the transport. Once the client has finished putting into the input buffer,Transport.processInput()
must be called. Successive calls to this method are not guaranteed to return the same object. OnceTransport.processInput()
is called the buffer must not be used.- Specified by:
getInputBuffer
in interfaceTransport
-
processInput
Description copied from interface:Transport
Tell the transport to process the data written to the input buffer. If the returned result indicates failure, the transport will not accept any more input. Specifically, any subsequentTransport.processInput()
calls on this object will throw an exception.- Specified by:
processInput
in interfaceTransport
- Returns:
- the result of processing the data, which indicates success or failure.
- See Also:
-
getOutputBuffer
Description copied from interface:Transport
Get a read-only byte buffer containing the transport's pending output. Once the client has finished getting from the output buffer,Transport.outputConsumed()
must be called. Successive calls to this method are not guaranteed to return the same object. OnceTransport.outputConsumed()
is called the buffer must not be used. If the transport's state changes AFTER calling this method, this will not be reflected in the output buffer.- Specified by:
getOutputBuffer
in interfaceTransport
-
outputConsumed
public void outputConsumed()Description copied from interface:Transport
Informs the transport that the output buffer returned byTransport.getOutputBuffer()
is finished with, allowing implementation-dependent steps to be performed such as reclaiming buffer space.- Specified by:
outputConsumed
in interfaceTransport
-
capacity
public int capacity() -
tail
-
process
- Specified by:
process
in interfaceTransport
- Throws:
TransportException
-
close_tail
public void close_tail()- Specified by:
close_tail
in interfaceTransport
-
pending
public int pending() -
head
-
pop
public void pop(int bytes) -
setIdleTimeout
public void setIdleTimeout(int timeout) - Specified by:
setIdleTimeout
in interfaceTransport
- Parameters:
timeout
- local idle timeout in milliseconds
-
getIdleTimeout
public int getIdleTimeout()- Specified by:
getIdleTimeout
in interfaceTransport
- Returns:
- local idle timeout in milliseconds
-
getRemoteIdleTimeout
public int getRemoteIdleTimeout()- Specified by:
getRemoteIdleTimeout
in interfaceTransport
- Returns:
- remote idle timeout in milliseconds
-
tick
public long tick(long now) Description copied from interface:Transport
Prompt the transport to perform work such as idle-timeout/heartbeat handling, and return an absolute deadline in milliseconds that tick must again be called by/at, based on the provided current time in milliseconds, to ensure the periodic work is carried out as necessary. A returned deadline of 0 indicates there is no periodic work necessitating tick be called, e.g. because neither peer has defined an idle-timeout value. The provided milliseconds time values can be fromSystem.currentTimeMillis()
or derived fromSystem.nanoTime()
, noting that for the later in particular that the returned deadline could be a different sign than the given time, and (if non-zero) the returned deadline should have the current time originally provided subtracted from it in order to establish a relative time delay to the next deadline. -
getFramesOutput
public long getFramesOutput()- Specified by:
getFramesOutput
in interfaceTransport
-
getFramesInput
public long getFramesInput()- Specified by:
getFramesInput
in interfaceTransport
-
close_head
public void close_head()- Specified by:
close_head
in interfaceTransport
-
isClosed
public boolean isClosed() -
toString
-
setFrameHandler
Override the default frame handler. Must be called before the transport starts being used (e.g.getInputBuffer()
,getOutputBuffer()
,ssl(SslDomain)
etc). -
setSelectable
-
getSelectable
-
setReactor
-
getReactor
-
setEmitFlowEventOnSend
public void setEmitFlowEventOnSend(boolean emitFlowEventOnSend) Description copied from interface:Transport
Configure whether a synthetic Flow event should be emitted when messages are sent, reflecting a change in the credit level on the link that may prompt other action. Defaults to true.- Specified by:
setEmitFlowEventOnSend
in interfaceTransport
- Parameters:
emitFlowEventOnSend
- true if a flow event should be emitted, false otherwise
-
isEmitFlowEventOnSend
public boolean isEmitFlowEventOnSend()- Specified by:
isEmitFlowEventOnSend
in interfaceTransport
-
setUseReadOnlyOutputBuffer
public void setUseReadOnlyOutputBuffer(boolean value) - Specified by:
setUseReadOnlyOutputBuffer
in interfaceTransportInternal
-
isUseReadOnlyOutputBuffer
public boolean isUseReadOnlyOutputBuffer()- Specified by:
isUseReadOnlyOutputBuffer
in interfaceTransportInternal
-
addTransportLayer
Description copied from interface:TransportInternal
Add aTransportLayer
to the transport, wrapping the input and output process handlers in the state they currently exist. No effect if the given layer was previously added.- Specified by:
addTransportLayer
in interfaceTransportInternal
- Parameters:
layer
- the layer to add (if it was not previously added)
-
setOutboundFrameSizeLimit
public void setOutboundFrameSizeLimit(int limit) Description copied from interface:Transport
Set an upper limit on the size of outgoing frames that will be sent to the peer. Allows constraining the transport not to emit Transfer frames over a given size even when the peers max frame size allows it. Must be set before receiving the peers Open frame to have effect.- Specified by:
setOutboundFrameSizeLimit
in interfaceTransport
- Parameters:
limit
- the size limit to apply
-
getOutboundFrameSizeLimit
public int getOutboundFrameSizeLimit()- Specified by:
getOutboundFrameSizeLimit
in interfaceTransport
-