Package org.jgroups

Class BatchMessage

  • All Implemented Interfaces:
    java.lang.Iterable<Message>, Constructable<Message>, Message, SizeStreamable, Streamable

    public class BatchMessage
    extends BaseMessage
    implements java.lang.Iterable<Message>
    A message that contains a batch of messages. This message will wrap several messages, so lower protocol layers only have to process them once. This increases throughput for cases such as when average message size is small, or there is a heavy processing cost (e.g. SEQUENCER).
    Similar to CompositeMessage but with some optimizations made for the specific use case.
    This class is unsynchronized; the envisaged use case is that a BatchMessage is created with a number of messages, or messages are added, but then the instance is not modified anymore and sent.
    Since:
    5.x
    Author:
    Bela Ban, Chris Johnson
    • Constructor Detail

      • BatchMessage

        public BatchMessage()
      • BatchMessage

        public BatchMessage​(Address dest,
                            int capacity)
    • Method Detail

      • create

        public java.util.function.Supplier<Message> create()
        Description copied from interface: Constructable
        Creates an instance of the class implementing this interface
        Specified by:
        create in interface Constructable<Message>
      • getType

        public short getType()
        Description copied from interface: Message
        Returns the type of the message, e.g. BYTES_MSG, OBJ_MSG etc
        Specified by:
        getType in interface Message
      • hasPayload

        public boolean hasPayload()
        Description copied from interface: Message
        Returns true if the message has a payload, e.g. a byte[] array in a BytesMessage or an object in an ObjectMessage. This is more generic than Message.hasArray(), as it is not just applicable to a byte array.
        Specified by:
        hasPayload in interface Message
        Returns:
        True if the message has a payload
      • hasArray

        public boolean hasArray()
        Description copied from interface: Message
        Returns true if this message has a byte[] array as payload (even if it's null!), false otherwise
        Specified by:
        hasArray in interface Message
      • getNumberOfMessages

        public int getNumberOfMessages()
      • getOffset

        public int getOffset()
        Description copied from interface: Message
        Returns the offset of the byte[] array at which user data starts. Throws an exception if the message does not have a byte[] array payload (if Message.hasArray() is false).
        Note that this is a convenience method, as most messages are of type BytesMessage.
        Specified by:
        getOffset in interface Message
      • getArray

        public byte[] getArray()
        Description copied from interface: Message
        Returns 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 a Message to the correct subtype and use the methods available there to get/set the payload.
        Specified by:
        getArray in interface Message
      • setArray

        public BatchMessage setArray​(byte[] b,
                                     int o,
                                     int l)
        Description copied from interface: Message
        Sets the byte array in a message.
        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 a Message to the correct subtype and use the methods available there to get/set the payload.
        Specified by:
        setArray in interface Message
      • setArray

        public BatchMessage setArray​(ByteArray buf)
        Description copied from interface: Message
        Sets the byte array in a message.
        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 a Message to the correct subtype and use the methods available there to get/set the payload.
        Specified by:
        setArray in interface Message
      • setObject

        public BatchMessage setObject​(java.lang.Object obj)
        Description copied from interface: Message
        Sets an object in a message. In a ObjectMessage, the object is set directly. In a BytesMessage, the object is serialized into a byte[] array and then the array is set as the payload of the message
        Specified by:
        setObject in interface Message
      • getObject

        public <T> T getObject()
        Description copied from interface: Message
        Gets an object from the payload. If the payload is a byte[] array (e.g. as in BytesMessage), 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.
        Specified by:
        getObject in interface Message
      • getMessages

        public Message[] getMessages()
      • getOrigSender

        public Address getOrigSender()
      • getLength

        public int getLength()
        Description copied from interface: Message
        Returns 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
        Specified by:
        getLength in interface Message
      • add

        public BatchMessage add​(Message msg)
        Adds the message at the end of the array. Increases the array if needed
      • get

        public <T extends Message> T get​(int index)
      • copy

        public BatchMessage copy​(boolean copy_payload,
                                 boolean copy_headers)
        Create a shallow copy of this BatchMessage.
        Specified by:
        copy in interface Message
        Overrides:
        copy in class BaseMessage
        Parameters:
        copy_payload - If true, the payload is copied, else it is null in the copied message
        copy_headers - If true, the headers are copied
      • size

        public int size()
        Description copied from interface: Message
        Returns the exact size of the marshalled message
        Specified by:
        size in interface Message
        Overrides:
        size in class BaseMessage
        Returns:
        The number of bytes for the marshalled message
      • iterator

        public java.util.Iterator<Message> iterator()
        Specified by:
        iterator in interface java.lang.Iterable<Message>
      • writePayload

        public void writePayload​(java.io.DataOutput out)
                          throws java.io.IOException
        Specified by:
        writePayload in interface Message
        Throws:
        java.io.IOException
      • readPayload

        public void readPayload​(java.io.DataInput in)
                         throws java.io.IOException,
                                java.lang.ClassNotFoundException
        Specified by:
        readPayload in interface Message
        Throws:
        java.io.IOException
        java.lang.ClassNotFoundException
      • ensureCapacity

        protected void ensureCapacity​(int size)