Class NioMessage
- All Implemented Interfaces:
Constructable<Message>,Message,SizeStreamable,Streamable
Message with a (heap-based or direct) ByteBuffer as payload.
Note that the payload of an NioMessage must not be modified after sending it (ie. JChannel.send(Message);
serialization depends on position and limit to be correct.
- Since:
- 5.0
-
Nested Class Summary
Nested classes/interfaces inherited from interface org.jgroups.Message
Message.Flag, Message.TransientFlag -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected ByteBufferThe payloadprotected booleanIf true, use direct memory when creatingByteBufferpayloads, e.g.Fields inherited from class org.jgroups.BaseMessage
dest, DEST_SET, flags, headers, sender, SRC_SET, transient_flagsFields inherited from interface org.jgroups.Message
BYTES_MSG, COMPOSITE_MSG, EARLYBATCH_MSG, EMPTY_MSG, FRAG_MSG, LONG_MSG, NIO_MSG, OBJ_MSG -
Constructor Summary
ConstructorsConstructorDescriptionNioMessage(Address dest) Constructs a message given a destination addressNioMessage(Address dest, ByteBuffer buf) Constructs a message given a destination and source address and the payload byte buffer -
Method Summary
Modifier and TypeMethodDescriptioncopy(boolean copy_payload, boolean copy_headers) Create a copy of the message.protected MessagecopyPayload(Message copy) Copies the payloadcreate()Creates an instance of the class implementing this interfaceprotected ByteBuffercreateBuffer(byte[] array, int offset, int length) byte[]getArray()Returns a reference to the payload (byte array).getBuf()Returns the byte buffer.intReturns the length of the byte[] array payload.<T> TGets an object from the payload.<T> TgetObject(ClassLoader loader) Tries to unmarshal the byte buffer payload into an objectintReturns the offset of the byte[] array at which user data starts.shortgetType()Returns the type of the message, e.g.booleanhasArray()Returns true if this message has a byte[] array as payload (even if it's null!), false otherwisebooleanReturns true if the message has a payload, e.g.booleanisDirect()voidreadPayload(DataInput in) setArray(byte[] b, int offset, int length) Sets the internal buffer to point to a subset of a given buffer.Sets the buffersetBuf(ByteBuffer b) Takes an object and uses Java serialization to generate the byte[] buffer which is set in the message.intsize()Returns the exact size of the marshalled messageprotected inttoString()booleanuseDirectMemory(boolean b) voidwritePayload(DataOutput out) Methods inherited from class org.jgroups.BaseMessage
clearFlag, clearFlag, clearHeaders, createHeaders, getDest, getFlags, getHeader, getHeaders, getNumHeaders, getPayload, getSrc, headers, headers, isFlagSet, isFlagSet, printHeaders, putHeader, putHeader, putHeaderIfAbsent, readFrom, serializedSize, setDest, setFlag, setFlag, setFlag, setFlagIfAbsent, setPayload, setSrc, writeTo, writeToNoAddrs
-
Field Details
-
buf
The payload -
use_direct_memory_for_allocations
protected boolean use_direct_memory_for_allocationsIf true, use direct memory when creatingByteBufferpayloads, e.g. onsetArray(byte[], int, int),setArray(ByteArray),setObject(Object)or when getting read from the network (readPayload(DataInput)).Unless this flag is set to true, a direct
ByteBufferpayload will become a heap-based payload by a receiver when sent over the network. This may be useful if we want to use off-heap (direct) memory only for sending, but not receiving of messages.If we want the receiver to create a direct-memory based message, set this flag to true before sending the message.
-
-
Constructor Details
-
NioMessage
public NioMessage() -
NioMessage
Constructs a message given a destination address- Parameters:
dest- The Address of the receiver. If it is null, then the message is sent to all cluster members. Otherwise, it is sent to a single member.
-
NioMessage
Constructs a message given a destination and source address and the payload byte buffer- Parameters:
dest- The Address of the receiver. If it is null, then the message is sent to all cluster members. Otherwise, it is sent to a single member.buf- The payload. Note that this buffer must not be modified (e.g. buf[0]='x' is not allowed) since we don't copy the contents.
-
-
Method Details
-
getBuf
Returns the byte buffer. Do not read from/write to it, or else retransmissions will fail! UseByteBuffer.duplicate()before, to create a copy, if the buffer needs to be read from -
setBuf
-
create
Description copied from interface:ConstructableCreates an instance of the class implementing this interface -
getType
public short getType()Description copied from interface:MessageReturns the type of the message, e.g. BYTES_MSG, OBJ_MSG etc -
useDirectMemory
public boolean useDirectMemory() -
useDirectMemory
-
hasPayload
public boolean hasPayload()Description copied from interface:MessageReturns true if the message has a payload, e.g. a byte[] array in aBytesMessageor an object in anObjectMessage. This is more generic thanMessage.hasArray(), as it is not just applicable to a byte array.- Returns:
- True if the message has a payload
-
hasArray
public boolean hasArray()Description copied from interface:MessageReturns true if this message has a byte[] array as payload (even if it's null!), false otherwise -
isDirect
public boolean isDirect() -
getOffset
public int getOffset()Description copied from interface:MessageReturns the offset of the byte[] array at which user data starts. Throws an exception if the message does not have a byte[] array payload (ifMessage.hasArray()is false).Note that this is a convenience method, as most messages are of type
BytesMessage. -
getLength
public int getLength()Description copied from interface:MessageReturns the length of the byte[] array payload. If the message does not have a byte[] array payload (Message.hasArray()is false), then the serialized size may be returned, or an implementation may choose to throw an exception -
getArray
public byte[] getArray()Description copied from interface:MessageReturns a reference to the payload (byte array). Note that this array should not be modified as we do not copy the array on copy() or clone(): the array of the copied message is simply a reference to the old array.Even if offset and length are used: we return the entire array, not a subset.
Throws an exception if the message does not have a byte[] array payload (
Message.hasArray()is false).Note that this is a convenience method, as most messages are of type
BytesMessage. It is recommended to downcast aMessageto the correct subtype and use the methods available there to get/set the payload. -
setArray
Sets the internal buffer to point to a subset of a given buffer.Note that the byte[] buffer passed as argument must not be modified. Reason: if we retransmit the message, it would still have a ref to the original byte[] buffer passed in as argument, and so we would retransmit a changed byte[] buffer !
- Parameters:
b- The reference to a given buffer. If null, we'll reset the buffer to nulloffset- The initial positionlength- The number of bytes
-
setArray
Sets the bufferNote that the byte[] buffer passed as argument must not be modified. Reason: if we retransmit the message, it would still have a ref to the original byte[] buffer passed in as argument, and so we would retransmit a changed byte[] buffer !
-
getObject
public <T> T getObject()Description copied from interface:MessageGets an object from the payload. If the payload is a byte[] array (e.g. as inBytesMessage), an attempt to de-serialize the array into an object is made, and the object returned.If the payload is an object (e.g. as is the case in
ObjectMessage), the object will be returned directly. -
getObject
Tries to unmarshal the byte buffer payload into an object- Returns:
- The object
-
setObject
Takes an object and uses Java serialization to generate the byte[] buffer which is set in the message. Parameter 'obj' has to be serializable (e.g. implementing Serializable, Externalizable or Streamable, or be a basic type (e.g. Integer, Short etc)). -
copy
Create a copy of the message.Note that for headers, only the arrays holding references to the headers are copied, not the headers themselves ! The consequence is that the headers array of the copy hold the *same* references as the original, so do *not* modify the headers ! If you want to change a header, copy it and call
BaseMessage.putHeader(short,Header)again.- Specified by:
copyin interfaceMessage- Overrides:
copyin classBaseMessage- Parameters:
copy_payload- Copy the buffercopy_headers- Copy the headers- Returns:
- Message with specified data
-
size
public int size()Description copied from interface:MessageReturns the exact size of the marshalled message- Specified by:
sizein interfaceMessage- Overrides:
sizein classBaseMessage- Returns:
- The number of bytes for the marshalled message
-
toString
- Overrides:
toStringin classBaseMessage
-
copyPayload
Description copied from class:BaseMessageCopies the payload- Overrides:
copyPayloadin classBaseMessage
-
sizeOfPayload
protected int sizeOfPayload() -
writePayload
- Throws:
IOException
-
readPayload
- Throws:
IOException
-
createBuffer
-