Class DeserializingMessage
- All Implemented Interfaces:
HasMessage
- Direct Known Subclasses:
ChunkedDeserializingMessage, DefaultEntityHelper.DeserializingMessageWithEntity, StatefulHandler.StatefulMemberMessage
Message that supports lazy deserialization, context caching, type adaptation, and batch-level
execution utilities.
DeserializingMessage combines a SerializedMessage with deserialization and routing logic while
maintaining the original message context (type, topic, metadata, and payload).
Key Features
- Supports on-demand deserialization of a
Message - Provides thread-local access to the message that is currently being handled
- Allows attaching resources to the current message or message batch/li>
- See Also:
-
Nested Class Summary
Nested Classes -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final Stringstatic final Stringstatic final Stringstatic MessageFormatterThe formatter used to produce a human-readable representation of this message, primarily for logging or debugging.Fields inherited from interface HasMessage
warnedAboutMissingProperty -
Constructor Summary
ConstructorsModifierConstructorDescriptionDeserializingMessage(io.fluxzero.common.api.SerializedMessage message, Function<Type, Object> payload, io.fluxzero.common.MessageType messageType, String topic, Serializer serializer) DeserializingMessage(@NonNull Message message, io.fluxzero.common.MessageType messageType, Serializer serializer) DeserializingMessage(@NonNull Message message, io.fluxzero.common.MessageType messageType, String topic, Serializer serializer) protectedDeserializingMessage(@NonNull DeserializingMessage input) DeserializingMessage(DeserializingObject<byte[], io.fluxzero.common.api.SerializedMessage> delegate, io.fluxzero.common.MessageType messageType, String topic, Serializer serializer) -
Method Summary
Modifier and TypeMethodDescription<T> Tapply(Function<DeserializingMessage, T> action) default booleanchunked()<T> TcomputeContextIfAbsent(Class<T> contextKey, Function<DeserializingMessage, ? extends T> provider) Returns a message-scoped context value, computing and storing it when it is absent.static <K,V> V computeForBatch(K key, BiFunction<? super K, ? super V, ? extends V> function) static <K,V> V computeForBatchIfAbsent(K key, Function<? super K, ? extends V> function) default booleanstatic <V> VgetBatchResource(Object key) static <V> VgetBatchResourceOrDefault(Object key, V defaultValue) <T> Optional<T> getContext(Class<T> contextKey) Returns a message-scoped context value.static DeserializingMessageReturns the currentDeserializingMessagebeing processed in this thread, ornullif none is set.getIndex()Returns the unique ID of the underlying message.io.fluxzero.common.api.Metadatastatic Optional<DeserializingMessage> Returns the currentDeserializingMessagebeing processed in this thread, if available.<V> VRetrieves the message payload, deserializing if necessary, cast to the expected type.<R> RgetPayloadAs(Type type) Retrieves the message payload, deserializing if necessary and optionally converted to the given type.Class<?> Returns the runtime class of the payload object, orVoid.classif the payload isnull.io.fluxzero.common.api.SerializedMessageReturns the timestamp at which the message was created or published.getType()static Stream<DeserializingMessage> handleBatch(Stream<DeserializingMessage> batch) booleandefault booleanputContext(Class<T> contextKey, T value) Stores a message-scoped context value.voidrun(Consumer<DeserializingMessage> task) Returns the underlyingMessagerepresentation of this object.toString()static voidwhenBatchCompletes(io.fluxzero.common.ThrowingConsumer<Throwable> executable) withData(io.fluxzero.common.api.Data<byte[]> data) withMetadata(io.fluxzero.common.api.Metadata metadata) withPayload(Object payload) Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface HasMessage
computeRoutingKey, getRoutingKey, getRoutingKey
-
Field Details
-
messageFormatter
The formatter used to produce a human-readable representation of this message, primarily for logging or debugging. By default, this usesMessageFormatter.DEFAULT.In advanced scenarios, users may replace this field with a custom
MessageFormatterimplementation to modify how deserializing messages are rendered (e.g., to include metadata or correlation IDs). -
FIRST_CHUNK
- See Also:
-
FINAL_CHUNK
- See Also:
-
CHUNK_INDEX
- See Also:
-
-
Constructor Details
-
DeserializingMessage
public DeserializingMessage(io.fluxzero.common.api.SerializedMessage message, Function<Type, Object> payload, io.fluxzero.common.MessageType messageType, String topic, Serializer serializer) -
DeserializingMessage
public DeserializingMessage(DeserializingObject<byte[], io.fluxzero.common.api.SerializedMessage> delegate, io.fluxzero.common.MessageType messageType, String topic, Serializer serializer) -
DeserializingMessage
public DeserializingMessage(@NonNull @NonNull Message message, io.fluxzero.common.MessageType messageType, Serializer serializer) -
DeserializingMessage
public DeserializingMessage(@NonNull @NonNull Message message, io.fluxzero.common.MessageType messageType, String topic, Serializer serializer) -
DeserializingMessage
-
-
Method Details
-
run
-
apply
-
toMessage
Description copied from interface:HasMessageReturns the underlyingMessagerepresentation of this object.- Specified by:
toMessagein interfaceHasMessage- Returns:
- the
Messagebacking this instance
-
getMetadata
public io.fluxzero.common.api.Metadata getMetadata() -
withMetadata
-
withPayload
-
getMessageId
Description copied from interface:HasMessageReturns the unique ID of the underlying message.- Specified by:
getMessageIdin interfaceHasMessage- Returns:
- the message ID
-
getIndex
-
getTimestamp
Description copied from interface:HasMessageReturns the timestamp at which the message was created or published.- Specified by:
getTimestampin interfaceHasMessage- Returns:
- the message timestamp
-
isDeserialized
public boolean isDeserialized() -
getPayload
public <V> V getPayload()Description copied from interface:HasMessageRetrieves the message payload, deserializing if necessary, cast to the expected type.By default, this delegates to
toMessage().getPayload().- Specified by:
getPayloadin interfaceHasMessage- Type Parameters:
V- the expected payload type- Returns:
- the deserialized payload
-
getPayloadAs
Description copied from interface:HasMessageRetrieves the message payload, deserializing if necessary and optionally converted to the given type.By default, this performs a conversion of the payload using
JsonUtils.- Specified by:
getPayloadAsin interfaceHasMessage- Type Parameters:
R- the expected payload type- Returns:
- the payload converted to the given type
-
getPayloadClass
Description copied from interface:HasMessageReturns the runtime class of the payload object, orVoid.classif the payload isnull.- Specified by:
getPayloadClassin interfaceHasMessage- Returns:
- the payload's class
-
getType
-
getSerializedObject
public io.fluxzero.common.api.SerializedMessage getSerializedObject() -
withData
-
computeContextIfAbsent
public <T> T computeContextIfAbsent(Class<T> contextKey, Function<DeserializingMessage, ? extends T> provider) Returns a message-scoped context value, computing and storing it when it is absent.- Parameters:
contextKey- the type key for the context valueprovider- the provider used to compute the value when absent- Returns:
- the existing or computed context value
-
getContext
Returns a message-scoped context value.- Parameters:
contextKey- the type key for the context value- Returns:
- the context value, or
Optional.empty()when absent
-
putContext
Stores a message-scoped context value.- Parameters:
contextKey- the type key for the context valuevalue- the context value to store- Returns:
- this message
-
getCurrent
Returns the currentDeserializingMessagebeing processed in this thread, ornullif none is set.This method provides direct (nullable) access to the thread-local message context. Prefer
getOptionally()when you want to safely handle absence of context.Note: This method should typically be called only inside handler code or interceptors where a
DeserializingMessageis known to be active.- Returns:
- the current message or
nullif no message is being processed - See Also:
-
getOptionally
Returns the currentDeserializingMessagebeing processed in this thread, if available.This method is safe to call in any thread and will return
Optional.empty()if no message is currently being handled. It is particularly useful for utility classes or exception handlers that want to conditionally access message metadata.Example
Optional<DeserializingMessage> message = DeserializingMessage.getOptionally(); message.map(DeserializingMessage::getPayloadType) .ifPresent(type -> log.debug("Handling message of type {}", type));- Returns:
- an
Optionalcontaining the current message or empty if none is set - See Also:
-
toString
-
handleBatch
-
whenBatchCompletes
-
computeForBatch
public static <K,V> V computeForBatch(K key, BiFunction<? super K, ? super V, ? extends V> function) -
computeForBatchIfAbsent
-
getBatchResource
-
getBatchResourceOrDefault
-
chunked
default boolean chunked() -
lastChunk
default boolean lastChunk() -
firstChunk
default boolean firstChunk()
-