Package com.rabbitmq.client.impl
Class AMQChannel
- java.lang.Object
-
- com.rabbitmq.client.impl.ShutdownNotifierComponent
-
- com.rabbitmq.client.impl.AMQChannel
-
- All Implemented Interfaces:
ShutdownNotifier
- Direct Known Subclasses:
ChannelN
public abstract class AMQChannel extends ShutdownNotifierComponent
Base class modelling an AMQ channel. Subclasses implementChannel.close()
andprocessAsync()
, and may choose to overrideprocessShutdownSignal()
andrpc()
.- See Also:
ChannelN
,Connection
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
AMQChannel.BlockingRpcContinuation<T>
static interface
AMQChannel.RpcContinuation
static class
AMQChannel.SimpleBlockingRpcContinuation
-
Field Summary
Fields Modifier and Type Field Description private RpcWrapper
_activeRpc
The current outstanding RPC request, if any.protected boolean
_blockContent
Whether transmission of content-bearing methods should be blockedprotected java.util.concurrent.locks.Lock
_channelLock
Protected; used instead of synchronizing on the channel itself, so that clients can themselves use the channel to synchronize on.protected java.util.concurrent.locks.Condition
_channelLockCondition
private int
_channelNumber
This channel's channel number.private boolean
_checkRpcResponseType
private AMQCommand
_command
Command being assembledprivate AMQConnection
_connection
The connection this channel is associated with.protected int
_rpcTimeout
Timeout for RPC callsprivate TrafficListener
_trafficListener
private ObservationCollector.ConnectionInfo
connectionInfo
private static org.slf4j.Logger
LOGGER
private int
maxInboundMessageBodySize
protected static int
NO_RPC_TIMEOUT
-
Constructor Summary
Constructors Constructor Description AMQChannel(AMQConnection connection, int channelNumber)
Construct a channel on the given connection, with the given channel number.
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description void
asyncRpc(Method m, java.util.concurrent.CompletableFuture<Command> future)
private void
cleanRpcChannelState()
protected ObservationCollector.ConnectionInfo
connectionInfo()
private void
doEnqueueRpc(java.util.function.Supplier<RpcWrapper> rpcWrapperSupplier)
void
enqueueAsyncRpc(Method method, java.util.concurrent.CompletableFuture<Command> future)
void
enqueueRpc(AMQChannel.RpcContinuation k)
void
ensureIsOpen()
java.util.concurrent.CompletableFuture<Command>
exnWrappingAsyncRpc(Method m)
AMQCommand
exnWrappingRpc(Method m)
Placeholder until we address bug 15786 (implementing a proper exception hierarchy).int
getChannelNumber()
Public API - Retrieves this channel's channel number.AMQConnection
getConnection()
void
handleCompleteInboundCommand(AMQCommand command)
Private API - handle a command which has been assembledvoid
handleFrame(Frame frame)
Private API - When the Connection receives a Frame for this channel, it passes it to this method.boolean
isOutstandingRpc()
protected void
markRpcFinished()
RpcWrapper
nextOutstandingRpc()
void
notifyOutstandingRpc(ShutdownSignalException signal)
private java.util.concurrent.CompletableFuture<Command>
privateAsyncRpc(Method m)
private AMQCommand
privateRpc(Method m)
private AMQCommand
privateRpc(Method m, int timeout)
abstract boolean
processAsync(Command command)
Protected API - called by nextCommand to check possibly handle an incoming Command before it is returned to the caller of nextCommand.void
processShutdownSignal(ShutdownSignalException signal, boolean ignoreClosed, boolean notifyRpc)
Protected API - respond, in the driver thread, to aShutdownSignalException
.void
quiescingAsyncRpc(Method m, java.util.concurrent.CompletableFuture<Command> future)
void
quiescingRpc(Method m, AMQChannel.RpcContinuation k)
void
quiescingTransmit(AMQCommand c)
void
quiescingTransmit(Method m)
AMQCommand
rpc(Method m)
Protected API - sends aMethod
to the broker and waits for the next in-bound Command from the broker: only for use from non-connection-MainLoop threads!AMQCommand
rpc(Method m, int timeout)
void
rpc(Method m, AMQChannel.RpcContinuation k)
java.lang.String
toString()
void
transmit(AMQCommand c)
void
transmit(Method m)
static java.io.IOException
wrap(ShutdownSignalException ex)
Placeholder until we address bug 15786 (implementing a proper exception hierarchy).static java.io.IOException
wrap(ShutdownSignalException ex, java.lang.String message)
protected ChannelContinuationTimeoutException
wrapTimeoutException(Method m, java.util.concurrent.TimeoutException e)
Cleans RPC channel state after a timeout and wraps the TimeoutException in a ChannelContinuationTimeoutException-
Methods inherited from class com.rabbitmq.client.impl.ShutdownNotifierComponent
addShutdownListener, getCloseReason, isOpen, notifyListeners, removeShutdownListener, setShutdownCauseIfOpen
-
-
-
-
Field Detail
-
LOGGER
private static final org.slf4j.Logger LOGGER
-
NO_RPC_TIMEOUT
protected static final int NO_RPC_TIMEOUT
- See Also:
- Constant Field Values
-
_channelLock
protected final java.util.concurrent.locks.Lock _channelLock
Protected; used instead of synchronizing on the channel itself, so that clients can themselves use the channel to synchronize on.
-
_channelLockCondition
protected final java.util.concurrent.locks.Condition _channelLockCondition
-
_connection
private final AMQConnection _connection
The connection this channel is associated with.
-
_channelNumber
private final int _channelNumber
This channel's channel number.
-
_command
private AMQCommand _command
Command being assembled
-
_activeRpc
private RpcWrapper _activeRpc
The current outstanding RPC request, if any. (Could become a queue in future.)
-
_blockContent
protected volatile boolean _blockContent
Whether transmission of content-bearing methods should be blocked
-
_rpcTimeout
protected final int _rpcTimeout
Timeout for RPC calls
-
_checkRpcResponseType
private final boolean _checkRpcResponseType
-
_trafficListener
private final TrafficListener _trafficListener
-
maxInboundMessageBodySize
private final int maxInboundMessageBodySize
-
connectionInfo
private final ObservationCollector.ConnectionInfo connectionInfo
-
-
Constructor Detail
-
AMQChannel
public AMQChannel(AMQConnection connection, int channelNumber)
Construct a channel on the given connection, with the given channel number.- Parameters:
connection
- the underlying connection for this channelchannelNumber
- the allocated reference number for this channel
-
-
Method Detail
-
getChannelNumber
public int getChannelNumber()
Public API - Retrieves this channel's channel number.- Returns:
- the channel number
-
handleFrame
public void handleFrame(Frame frame) throws java.io.IOException
Private API - When the Connection receives a Frame for this channel, it passes it to this method.- Parameters:
frame
- the incoming frame- Throws:
java.io.IOException
- if an error is encountered
-
wrap
public static java.io.IOException wrap(ShutdownSignalException ex)
Placeholder until we address bug 15786 (implementing a proper exception hierarchy). In the meantime, this at least won't throw away any information from the wrapped exception.- Parameters:
ex
- the exception to wrap- Returns:
- the wrapped exception
-
wrap
public static java.io.IOException wrap(ShutdownSignalException ex, java.lang.String message)
-
exnWrappingRpc
public AMQCommand exnWrappingRpc(Method m) throws java.io.IOException
Placeholder until we address bug 15786 (implementing a proper exception hierarchy).- Throws:
java.io.IOException
-
exnWrappingAsyncRpc
public java.util.concurrent.CompletableFuture<Command> exnWrappingAsyncRpc(Method m) throws java.io.IOException
- Throws:
java.io.IOException
-
handleCompleteInboundCommand
public void handleCompleteInboundCommand(AMQCommand command) throws java.io.IOException
Private API - handle a command which has been assembled- Parameters:
command
- the incoming command- Throws:
java.io.IOException
- if there's any problemjava.io.IOException
-
enqueueRpc
public void enqueueRpc(AMQChannel.RpcContinuation k)
-
enqueueAsyncRpc
public void enqueueAsyncRpc(Method method, java.util.concurrent.CompletableFuture<Command> future)
-
doEnqueueRpc
private void doEnqueueRpc(java.util.function.Supplier<RpcWrapper> rpcWrapperSupplier)
-
isOutstandingRpc
public boolean isOutstandingRpc()
-
nextOutstandingRpc
public RpcWrapper nextOutstandingRpc()
-
markRpcFinished
protected void markRpcFinished()
-
ensureIsOpen
public void ensureIsOpen() throws AlreadyClosedException
- Throws:
AlreadyClosedException
-
rpc
public AMQCommand rpc(Method m) throws java.io.IOException, ShutdownSignalException
Protected API - sends aMethod
to the broker and waits for the next in-bound Command from the broker: only for use from non-connection-MainLoop threads!- Throws:
java.io.IOException
ShutdownSignalException
-
rpc
public AMQCommand rpc(Method m, int timeout) throws java.io.IOException, ShutdownSignalException, java.util.concurrent.TimeoutException
- Throws:
java.io.IOException
ShutdownSignalException
java.util.concurrent.TimeoutException
-
privateRpc
private AMQCommand privateRpc(Method m) throws java.io.IOException, ShutdownSignalException
- Throws:
java.io.IOException
ShutdownSignalException
-
cleanRpcChannelState
private void cleanRpcChannelState()
-
wrapTimeoutException
protected ChannelContinuationTimeoutException wrapTimeoutException(Method m, java.util.concurrent.TimeoutException e)
Cleans RPC channel state after a timeout and wraps the TimeoutException in a ChannelContinuationTimeoutException
-
privateAsyncRpc
private java.util.concurrent.CompletableFuture<Command> privateAsyncRpc(Method m) throws java.io.IOException, ShutdownSignalException
- Throws:
java.io.IOException
ShutdownSignalException
-
privateRpc
private AMQCommand privateRpc(Method m, int timeout) throws java.io.IOException, ShutdownSignalException, java.util.concurrent.TimeoutException
- Throws:
java.io.IOException
ShutdownSignalException
java.util.concurrent.TimeoutException
-
rpc
public void rpc(Method m, AMQChannel.RpcContinuation k) throws java.io.IOException
- Throws:
java.io.IOException
-
quiescingRpc
public void quiescingRpc(Method m, AMQChannel.RpcContinuation k) throws java.io.IOException
- Throws:
java.io.IOException
-
asyncRpc
public void asyncRpc(Method m, java.util.concurrent.CompletableFuture<Command> future) throws java.io.IOException
- Throws:
java.io.IOException
-
quiescingAsyncRpc
public void quiescingAsyncRpc(Method m, java.util.concurrent.CompletableFuture<Command> future) throws java.io.IOException
- Throws:
java.io.IOException
-
processAsync
public abstract boolean processAsync(Command command) throws java.io.IOException
Protected API - called by nextCommand to check possibly handle an incoming Command before it is returned to the caller of nextCommand. If this method returns true, the command is considered handled and is not passed back to nextCommand's caller; if it returns false, nextCommand returns the command as usual. This is used in subclasses to implement handling of Basic.Return and Basic.Deliver messages, as well as Channel.Close and Connection.Close.- Parameters:
command
- the command to handle asynchronously- Returns:
- true if we handled the command; otherwise the caller should consider it "unhandled"
- Throws:
java.io.IOException
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
processShutdownSignal
public void processShutdownSignal(ShutdownSignalException signal, boolean ignoreClosed, boolean notifyRpc)
Protected API - respond, in the driver thread, to aShutdownSignalException
.- Parameters:
signal
- the signal to handleignoreClosed
- the flag indicating whether to ignore the AlreadyClosedException thrown when the channel is already closednotifyRpc
- the flag indicating whether any remaining rpc continuation should be notified with the given signal
-
notifyOutstandingRpc
public void notifyOutstandingRpc(ShutdownSignalException signal)
-
transmit
public void transmit(Method m) throws java.io.IOException
- Throws:
java.io.IOException
-
transmit
public void transmit(AMQCommand c) throws java.io.IOException
- Throws:
java.io.IOException
-
quiescingTransmit
public void quiescingTransmit(Method m) throws java.io.IOException
- Throws:
java.io.IOException
-
quiescingTransmit
public void quiescingTransmit(AMQCommand c) throws java.io.IOException
- Throws:
java.io.IOException
-
getConnection
public AMQConnection getConnection()
-
connectionInfo
protected ObservationCollector.ConnectionInfo connectionInfo()
-
-