Package org.jgroups
Class JChannel
- java.lang.Object
-
- org.jgroups.JChannel
-
- All Implemented Interfaces:
java.io.Closeable
,java.lang.AutoCloseable
- Direct Known Subclasses:
ForkChannel
public class JChannel extends java.lang.Object implements java.io.Closeable
A channel represents a group communication endpoint (like a socket). An application joins a cluster by connecting the channel to a cluster name and leaves it by disconnecting. Messages sent over the channel are received by all cluster members that are connected to the same cluster (that is, all members that have the same cluster name). The state machine for a channel is as follows: a channel is created (unconnected). The channel is connected to a cluster (connected). Messages can now be sent and received. The channel is disconnected from the cluster (unconnected). The channel could now be connected to a different cluster again. The channel is closed (closed). Only a single sender is allowed to be connected to a channel at a time, but there can be more than one channel in an application. Messages can be sent to the cluster members using the send method and messages can be received by setting aReceiver
insetReceiver(Receiver)
and implementing theReceiver.receive(Message)
callback.- Since:
- 2.0
- Author:
- Bela Ban
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
JChannel.State
-
Field Summary
Fields Modifier and Type Field Description protected java.util.List<AddressGenerator>
address_generators
protected java.util.Set<ChannelListener>
channel_listeners
protected java.lang.String
cluster_name
protected boolean
discard_own_messages
protected Address
local_addr
protected Log
log
protected java.lang.String
name
protected DiagnosticsHandler.ProbeHandler
probe_handler
protected ProtocolStack
prot_stack
protected Receiver
receiver
protected JChannel.State
state
protected Promise<StateTransferResult>
state_promise
protected boolean
state_transfer_supported
protected boolean
stats
protected UpHandler
up_handler
protected View
view
-
Constructor Summary
Constructors Constructor Description JChannel()
Creates aJChannel
with the default stackJChannel(boolean create_protocol_stack)
Creates a JChannel without a protocol stack; used for programmatic creation of channel and protocol stackJChannel(java.io.InputStream input)
Creates a channel with a configuration based on an input stream.JChannel(java.lang.String props)
Constructs a JChannel instance with the protocol stack configuration based upon the specified properties parameter.JChannel(java.util.List<Protocol> protocols)
Creates a channel from a list of protocols.JChannel(ProtocolStackConfigurator configurator)
Constructs a JChannel with the protocol stack configuration contained by the protocol stack configurator parameter.JChannel(Protocol... protocols)
Creates a channel from an array of protocols.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected JChannel
_close(boolean disconnect)
protected JChannel
_connect(Event evt)
protected boolean
_preConnect(java.lang.String cluster_name)
JChannel
addAddressGenerator(AddressGenerator address_generator)
Sets the newAddressGenerator
.JChannel
addChannelListener(ChannelListener listener)
Adds a ChannelListener that will be notified when a connect, disconnect or close occursAddress
address()
protected JChannel
checkClosed()
protected JChannel
checkClosedOrNotConnected()
protected JChannel
cleanup()
JChannel
clearChannelListeners()
void
close()
Destroys the channel and its associated resources (e.g.java.lang.String
clusterName()
JChannel
connect(java.lang.String cluster_name)
Joins the cluster.JChannel
connect(java.lang.String cluster_name, Address target, long timeout)
Joins the cluster and gets the state from a specified state provider. This method invokesconnect
and
getState
methods.
protected Address
determineCoordinator()
JChannel
disconnect()
Leaves the cluster (disconnects the channel if it is connected).java.lang.Object
down(Event evt)
Sends an event down the protocol stack.java.lang.Object
down(Message msg)
java.util.concurrent.CompletableFuture<java.lang.Object>
down(Message msg, boolean async)
Sends a message down asynchronously.java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.Object>>
dumpStats()
Returns a map of statistics of the various protocols and of the channel itselfjava.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.Object>>
dumpStats(java.lang.String protocol_name)
java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.Object>>
dumpStats(java.lang.String protocol_name, java.util.List<java.lang.String> attrs)
protected Address
generateAddress(java.lang.String name)
Address
getAddress()
java.lang.String
getAddressAsString()
java.lang.String
getAddressAsUUID()
java.lang.String
getClusterName()
boolean
getDiscardOwnMessages()
java.lang.String
getName()
java.lang.String
getProperties()
Returns the protocol stack configuration in string format.ProtocolStack
getProtocolStack()
Receiver
getReceiver()
java.lang.String
getState()
JChannel
getState(Address target, long timeout)
Retrieves the full state from the target member.
The state transfer is initiated by invoking getState() on this channel.boolean
getStats()
UpHandler
getUpHandler()
static java.lang.String
getVersion()
View
getView()
java.lang.String
getViewAsString()
protected JChannel
init()
Initializes all variables.protected JChannel
init(ProtocolStackConfigurator configurator)
protected java.lang.Object
invokeCallback(int type, java.lang.Object arg)
boolean
isClosed()
boolean
isConnected()
boolean
isConnecting()
boolean
isOpen()
java.lang.String
name()
JChannel
name(java.lang.String name)
protected JChannel
notifyChannelClosed(JChannel c)
protected JChannel
notifyChannelConnected(JChannel c)
protected JChannel
notifyChannelDisconnected(JChannel c)
protected JChannel
notifyListeners(java.util.function.Consumer<ChannelListener> func, java.lang.String msg)
java.lang.String
printProtocolSpec(boolean include_props)
Dumps all protocols in string format.JChannel
receiver(Receiver r)
boolean
removeAddressGenerator(AddressGenerator address_generator)
JChannel
removeChannelListener(ChannelListener listener)
JChannel
send(Address dst, byte[] buf)
Sends a message.JChannel
send(Address dst, byte[] buf, int offset, int length)
Sends a message to a destination.JChannel
send(Address dst, java.lang.Object obj)
Helper method to create a Message with given parameters and invokesend(Message)
.JChannel
send(Message msg)
Sends a message.protected JChannel
setAddress()
Generates local_addr.JChannel
setDiscardOwnMessages(boolean flag)
JChannel
setName(java.lang.String name)
Sets the logical name for the channel.JChannel
setReceiver(Receiver r)
JChannel
setStats(boolean stats)
JChannel
setUpHandler(UpHandler h)
ProtocolStack
stack()
protected JChannel
startStack(java.lang.String cluster_name)
boolean
stats()
JChannel
stats(boolean stats)
protected JChannel
stopStack(boolean stop, boolean destroy)
java.lang.String
toString()
java.lang.String
toString(boolean details)
java.lang.Object
up(Event evt)
Callback method
Called by the ProtocolStack when a message is received.java.lang.Object
up(Message msg)
JChannel
up(MessageBatch batch)
Callback invoked by the protocol stack to deliver a message batchView
view()
-
-
-
Field Detail
-
receiver
protected Receiver receiver
-
local_addr
protected Address local_addr
-
name
protected java.lang.String name
-
cluster_name
protected java.lang.String cluster_name
-
view
protected View view
-
state
protected volatile JChannel.State state
-
prot_stack
protected ProtocolStack prot_stack
-
up_handler
protected UpHandler up_handler
-
channel_listeners
protected java.util.Set<ChannelListener> channel_listeners
-
log
protected final Log log
-
address_generators
protected java.util.List<AddressGenerator> address_generators
-
state_promise
protected final Promise<StateTransferResult> state_promise
-
state_transfer_supported
protected boolean state_transfer_supported
-
probe_handler
protected final DiagnosticsHandler.ProbeHandler probe_handler
-
stats
protected boolean stats
-
discard_own_messages
protected boolean discard_own_messages
-
-
Constructor Detail
-
JChannel
public JChannel(boolean create_protocol_stack)
Creates a JChannel without a protocol stack; used for programmatic creation of channel and protocol stack- Parameters:
create_protocol_stack
- If true, the default config is used. If false, no protocol stack is created
-
JChannel
public JChannel() throws java.lang.Exception
Creates aJChannel
with the default stack- Throws:
java.lang.Exception
-
JChannel
public JChannel(java.lang.String props) throws java.lang.Exception
Constructs a JChannel instance with the protocol stack configuration based upon the specified properties parameter.- Parameters:
props
- A file containing a JGroups XML configuration or a URL pointing to an XML configuration- Throws:
java.lang.Exception
-
JChannel
public JChannel(java.io.InputStream input) throws java.lang.Exception
Creates a channel with a configuration based on an input stream.- Parameters:
input
- An input stream, pointing to a streamed configuration. It is the caller's resposibility to close the input stream after the constructor returns- Throws:
java.lang.Exception
-
JChannel
public JChannel(ProtocolStackConfigurator configurator) throws java.lang.Exception
Constructs a JChannel with the protocol stack configuration contained by the protocol stack configurator parameter.All the public constructors of this class eventually delegate to this method.
- Parameters:
configurator
- A protocol stack configurator containing a JGroups protocol stack configuration.- Throws:
java.lang.Exception
-
JChannel
public JChannel(Protocol... protocols) throws java.lang.Exception
Creates a channel from an array of protocols. Note that after aclose()
, the protocol list should not be reused, ie. new JChannel(protocols) would reuse the same protocol list, and this might lead to problems!- Parameters:
protocols
- The list of protocols, from bottom to top, ie. the first protocol in the list is the transport, the last the top protocol- Throws:
java.lang.Exception
-
JChannel
public JChannel(java.util.List<Protocol> protocols) throws java.lang.Exception
Creates a channel from a list of protocols. Note that after aclose()
, the protocol list should not be reused, ie. new JChannel(protocols) would reuse the same protocol list, and this might lead to problems !- Parameters:
protocols
- The list of protocols, from bottom to top, ie. the first protocol in the list is the transport, the last the top protocol- Throws:
java.lang.Exception
-
-
Method Detail
-
getReceiver
public Receiver getReceiver()
-
getAddress
public Address getAddress()
-
address
public Address address()
-
getName
public java.lang.String getName()
-
name
public java.lang.String name()
-
name
public JChannel name(java.lang.String name)
-
clusterName
public java.lang.String clusterName()
-
getView
public View getView()
-
view
public View view()
-
getProtocolStack
public ProtocolStack getProtocolStack()
-
stack
public ProtocolStack stack()
-
getUpHandler
public UpHandler getUpHandler()
-
getStats
public boolean getStats()
-
stats
public boolean stats()
-
setStats
public JChannel setStats(boolean stats)
-
stats
public JChannel stats(boolean stats)
-
getDiscardOwnMessages
public boolean getDiscardOwnMessages()
-
setDiscardOwnMessages
public JChannel setDiscardOwnMessages(boolean flag)
-
getAddressAsString
public java.lang.String getAddressAsString()
-
getAddressAsUUID
public java.lang.String getAddressAsUUID()
-
setName
public JChannel setName(java.lang.String name)
Sets the logical name for the channel. The name will stay associated with this channel for the channel's lifetime (until close() is called). This method must be called before calling connect()
-
getClusterName
public java.lang.String getClusterName()
-
getViewAsString
public java.lang.String getViewAsString()
-
getState
public java.lang.String getState()
-
isOpen
public boolean isOpen()
-
isConnected
public boolean isConnected()
-
isConnecting
public boolean isConnecting()
-
isClosed
public boolean isClosed()
-
getVersion
public static java.lang.String getVersion()
-
addChannelListener
public JChannel addChannelListener(ChannelListener listener)
Adds a ChannelListener that will be notified when a connect, disconnect or close occurs
-
removeChannelListener
public JChannel removeChannelListener(ChannelListener listener)
-
clearChannelListeners
public JChannel clearChannelListeners()
-
addAddressGenerator
public JChannel addAddressGenerator(AddressGenerator address_generator)
Sets the newAddressGenerator
. New addresses will be generated using the new generator. This should not be done while a channel is connected, but before connecting.- Parameters:
address_generator
-- Since:
- 2.12
-
removeAddressGenerator
public boolean removeAddressGenerator(AddressGenerator address_generator)
-
getProperties
public java.lang.String getProperties()
Returns the protocol stack configuration in string format. An example of this property is"UDP:PING:FDALL:STABLE:NAKACK2:UNICAST3:FRAG2:GMS"
-
printProtocolSpec
public java.lang.String printProtocolSpec(boolean include_props)
Dumps all protocols in string format. If include_props is set, the attrs of each protocol are also printed
-
dumpStats
public java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.Object>> dumpStats()
Returns a map of statistics of the various protocols and of the channel itself
-
dumpStats
public java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.Object>> dumpStats(java.lang.String protocol_name, java.util.List<java.lang.String> attrs)
-
dumpStats
public java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.Object>> dumpStats(java.lang.String protocol_name)
-
connect
public JChannel connect(java.lang.String cluster_name) throws java.lang.Exception
Joins the cluster. The application is now able to receive messages from cluster members, views and to send messages to (all or single) cluster members. This is a no-op if already connected. All channels connecting to the same cluster name form a cluster; messages sent to the cluster will be received by all cluster members.- Parameters:
cluster_name
- The name of the cluster to join- Throws:
java.lang.Exception
- The protocol stack cannot be startedjava.lang.IllegalStateException
- The channel is closed
-
connect
public JChannel connect(java.lang.String cluster_name, Address target, long timeout) throws java.lang.Exception
Joins the cluster and gets the state from a specified state provider. This method invokesconnect
and
getState
methods. If the channel is closed an exception will be thrown.
- Parameters:
cluster_name
- the cluster name to connect to. Cannot be null.target
- the state provider. If null, the state will be fetched from coordinator, unless this channel is coordinator.timeout
- the timeout for state transfer.- Throws:
java.lang.Exception
- Connecting to the cluster or state transfer was not successfuljava.lang.IllegalStateException
- The channel is closed and therefore cannot be used
-
disconnect
public JChannel disconnect()
Leaves the cluster (disconnects the channel if it is connected). If the channel is closed or disconnected, this operation is ignored. The channel can then be used to join the same or a different cluster again.- See Also:
connect(String)
-
close
public void close()
Destroys the channel and its associated resources (e.g. the protocol stack). After a channel has been closed, invoking methods on it will throw aChannelClosed
exception (or results in a null operation). It is a no-op if the channel is already closed. If the channel is connected to a cluster,disconnect()
will be called first.- Specified by:
close
in interfacejava.lang.AutoCloseable
- Specified by:
close
in interfacejava.io.Closeable
-
send
public JChannel send(Message msg) throws java.lang.Exception
Sends a message. The message contains- a destination address (Address). A
null
address sends the message to all cluster members. - a source address. Can be left empty as it will be assigned automatically
- a byte buffer. The message contents.
- several additional fields. They can be used by application programs (or patterns). E.g. a message ID, flags etc
- Parameters:
msg
- the message to be sent. Destination and buffer should be set. A null destination means to send to all group members.- Throws:
java.lang.IllegalStateException
- thrown if the channel is disconnected or closedjava.lang.Exception
- a destination address (Address). A
-
send
public JChannel send(Address dst, java.lang.Object obj) throws java.lang.Exception
Helper method to create a Message with given parameters and invokesend(Message)
.- Parameters:
dst
- destination address for the message. If null, the message will be sent to all cluster membersobj
- a serializable object. Will be marshalled into the byte buffer of the message. If it is not serializable, an exception will be thrown- Throws:
java.lang.Exception
- exception thrown if message sending was not successful
-
send
public JChannel send(Address dst, byte[] buf) throws java.lang.Exception
Sends a message. Seesend(Address,byte[],int,int)
for details- Parameters:
dst
- destination address for the message. If null, the message will be sent to all cluster membersbuf
- buffer message payload- Throws:
java.lang.Exception
- exception thrown if the message sending was not successful
-
send
public JChannel send(Address dst, byte[] buf, int offset, int length) throws java.lang.Exception
Sends a message to a destination. * @param dst the destination address. If null, the message will be sent to all cluster nodes (= cluster members)- Parameters:
buf
- the buffer to be sentoffset
- the offset into the bufferlength
- the length of the data to be sent. Has to be <= buf.length - offset. This will sendlength
bytes starting atoffset
- Throws:
java.lang.Exception
- thrown if send() failed
-
getState
public JChannel getState(Address target, long timeout) throws java.lang.Exception
Retrieves the full state from the target member.
The state transfer is initiated by invoking getState() on this channel. The state provider in turn invokes theReceiver.getState(java.io.OutputStream)
callback and sends the state to this node, the state receiver. After the state is received by the state receiver, theReceiver.setState(java.io.InputStream)
callback is invoked to install the state.- Parameters:
target
- the state provider. If null the coordinator is used by defaulttimeout
- the number of milliseconds to wait for the operation to complete successfully. 0 waits forever, or until the state has been received- Throws:
java.lang.IllegalStateException
- the channel was closed or disconnected, or the flush (if present) failedStateTransferException
- raised if there was a problem during the state transferjava.lang.Exception
- See Also:
Receiver.getState(java.io.OutputStream)
,Receiver.setState(java.io.InputStream)
-
down
public java.lang.Object down(Event evt)
Sends an event down the protocol stack. Note that - contrary tosend(Message)
, if the event is a message, no checks are performed whether the channel is closed or disconnected. Note that this method is not typically used by applications.- Parameters:
evt
- the message to send down, encapsulated in an event
-
down
public java.lang.Object down(Message msg)
-
down
public java.util.concurrent.CompletableFuture<java.lang.Object> down(Message msg, boolean async)
Sends a message down asynchronously. The sending is executed in the transport's thread pool. If the pool is full and the message is marked asMessage.TransientFlag.DONT_BLOCK
, then it will be dropped, otherwise it will be sent on the caller's thread.- Parameters:
msg
- The message to be sentasync
- Whether to send the message asynchronously- Returns:
- A CompletableFuture of the result (or exception)
-
up
public java.lang.Object up(Event evt)
Callback method
Called by the ProtocolStack when a message is received.- Parameters:
evt
- the event carrying the message from the protocol stack
-
up
public java.lang.Object up(Message msg)
-
up
public JChannel up(MessageBatch batch)
Callback invoked by the protocol stack to deliver a message batch
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
toString
public java.lang.String toString(boolean details)
-
_preConnect
protected boolean _preConnect(java.lang.String cluster_name) throws java.lang.Exception
- Throws:
java.lang.Exception
-
_connect
protected JChannel _connect(Event evt) throws java.lang.Exception
- Throws:
java.lang.Exception
-
cleanup
protected JChannel cleanup()
-
invokeCallback
protected java.lang.Object invokeCallback(int type, java.lang.Object arg)
-
init
protected final JChannel init(ProtocolStackConfigurator configurator) throws java.lang.Exception
- Throws:
java.lang.Exception
-
init
protected JChannel init()
Initializes all variables. Used after close() or disconnect(), to be ready for new connect()
-
startStack
protected JChannel startStack(java.lang.String cluster_name) throws java.lang.Exception
- Throws:
java.lang.Exception
-
setAddress
protected JChannel setAddress()
Generates local_addr. Sends down a REMOVE_ADDRESS (if existing address was present) and a SET_LOCAL_ADDRESS
-
generateAddress
protected Address generateAddress(java.lang.String name)
-
checkClosed
protected JChannel checkClosed()
-
checkClosedOrNotConnected
protected JChannel checkClosedOrNotConnected()
-
_close
protected JChannel _close(boolean disconnect)
-
stopStack
protected JChannel stopStack(boolean stop, boolean destroy)
-
determineCoordinator
protected Address determineCoordinator()
-
notifyListeners
protected JChannel notifyListeners(java.util.function.Consumer<ChannelListener> func, java.lang.String msg)
-
-