blob: c033e467917cafc8d89644c0d8d1e27e2c25e4b4 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.pulsar.client.api;
import java.util.Map;
import java.util.Optional;
import org.apache.pulsar.common.api.EncryptionContext;
import org.apache.pulsar.common.classification.InterfaceAudience;
import org.apache.pulsar.common.classification.InterfaceStability;
/**
* The message abstraction used in Pulsar.
*/
@InterfaceAudience.Public
@InterfaceStability.Stable
public interface Message<T> {
/**
* Return the properties attached to the message.
*
* <p>Properties are application defined key/value pairs that will be attached to the message.
*
* @return an unmodifiable view of the properties map
*/
Map<String, String> getProperties();
/**
* Check whether the message has a specific property attached.
*
* @param name the name of the property to check
* @return true if the message has the specified property and false if the properties is not defined
*/
boolean hasProperty(String name);
/**
* Get the value of a specific property.
*
* @param name the name of the property
* @return the value of the property or null if the property was not defined
*/
String getProperty(String name);
/**
* Get the raw payload of the message.
*
* <p>Even when using the Schema and type-safe API, an application
* has access to the underlying raw message payload.
*
* @return the byte array with the message payload
*/
byte[] getData();
/**
* Get the uncompressed message payload size in bytes.
*
* @return size in bytes.
*/
int size();
/**
* Get the de-serialized value of the message, according the configured {@link Schema}.
*
* @return the deserialized value of the message
*/
T getValue();
/**
* Get the unique message ID associated with this message.
*
* <p>The message id can be used to univocally refer to a message without having the keep
* the entire payload in memory.
*
* <p>Only messages received from the consumer will have a message id assigned.
*
* @return the message id null if this message was not received by this client instance
*/
MessageId getMessageId();
/**
* Get the publish time of this message. The publish time is the timestamp that a client publish the message.
*
* @return publish time of this message.
* @see #getEventTime()
*/
long getPublishTime();
/**
* Get the event time associated with this message. It is typically set by the applications via
* {@link MessageBuilder#setEventTime(long)}.
*
* <p>If there isn't any event time associated with this event, it will return 0.
*
* @see MessageBuilder#setEventTime(long)
* @since 1.20.0
* @return the message event time or 0 if event time wasn't set
*/
long getEventTime();
/**
* Get the sequence id associated with this message. It is typically set by the applications via
* {@link MessageBuilder#setSequenceId(long)}.
*
* @return sequence id associated with this message.
* @see MessageBuilder#setEventTime(long)
* @since 1.22.0
*/
long getSequenceId();
/**
* Get the producer name who produced this message.
*
* @return producer name who produced this message, null if producer name is not set.
* @since 1.22.0
*/
String getProducerName();
/**
* Check whether the message has a key.
*
* @return true if the key was set while creating the message and false if the key was not set
* while creating the message
*/
boolean hasKey();
/**
* Get the key of the message.
*
* @return the key of the message
*/
String getKey();
/**
* Check whether the key has been base64 encoded.
*
* @return true if the key is base64 encoded, false otherwise
*/
boolean hasBase64EncodedKey();
/**
* Get bytes in key. If the key has been base64 encoded, it is decoded before being returned.
* Otherwise, if the key is a plain string, this method returns the UTF_8 encoded bytes of the string.
* @return the key in byte[] form
*/
byte[] getKeyBytes();
/**
* Check whether the message has a ordering key.
*
* @return true if the ordering key was set while creating the message
* false if the ordering key was not set while creating the message
*/
boolean hasOrderingKey();
/**
* Get the ordering key of the message.
*
* @return the ordering key of the message
*/
byte[] getOrderingKey();
/**
* Get the topic the message was published to.
*
* @return the topic the message was published to
*/
String getTopicName();
/**
* {@link EncryptionContext} contains encryption and compression information in it using which application can
* decrypt consumed message with encrypted-payload.
*
* @return the optiona encryption context
*/
Optional<EncryptionContext> getEncryptionCtx();
/**
* Get message redelivery count, redelivery count maintain in pulsar broker. When client acknowledge message
* timeout, broker will dispatch message again with message redelivery count in CommandMessage defined.
*
* <p>Message redelivery increases monotonically in a broker, when topic switch ownership to a another broker
* redelivery count will be recalculated.
*
* @since 2.3.0
* @return message redelivery count
*/
int getRedeliveryCount();
/**
* Get schema version of the message.
* @since 2.4.0
* @return Schema version of the message if the message is produced with schema otherwise null.
*/
byte[] getSchemaVersion();
/**
* Get the schema associated to the message.
* Please note that this schema is usually equal to the Schema you passed
* during the construction of the Consumer or the Reader.
* But if you are consuming the topic using the GenericObject interface
* this method will return the schema associated with the message.
* @return The schema used to decode the payload of message.
* @see Schema#AUTO_CONSUME()
*/
default Optional<Schema<?>> getReaderSchema() {
return Optional.empty();
}
/**
* Check whether the message is replicated from other cluster.
*
* @since 2.4.0
* @return true if the message is replicated from other cluster.
* false otherwise.
*/
boolean isReplicated();
/**
* Get name of cluster, from which the message is replicated.
*
* @since 2.4.0
* @return the name of cluster, from which the message is replicated.
*/
String getReplicatedFrom();
/**
* Release a message back to the pool. This is required only if the consumer was created with the option to pool
* messages, otherwise it will have no effect.
*
* @since 2.8.0
*/
void release();
/**
* Check whether the message has a broker publish time
*
* @since 2.9.0
* @return true if the message has a broker publish time, otherwise false.
*/
boolean hasBrokerPublishTime();
/**
* Get broker publish time from broker entry metadata.
* Note that only if the feature is enabled in the broker then the value is available.
*
* @since 2.9.0
* @return broker publish time from broker entry metadata, or empty if the feature is not enabled in the broker.
*/
Optional<Long> getBrokerPublishTime();
/**
* Check whether the message has a index.
*
* @since 2.9.0
* @return true if the message has a index, otherwise false.
*/
boolean hasIndex();
/**
* Get index from broker entry metadata.
* Note that only if the feature is enabled in the broker then the value is available.
*
* @since 2.9.0
* @return index from broker entry metadata, or empty if the feature is not enabled in the broker.
*/
Optional<Long> getIndex();
}