On 5/1/25 15:31, Justin Bertram wrote:
I can see that it arrives as you describe as a large message but it reads
it all into memory (ActiveMQTextMessage) before reaching user code...

Are you using the streaming pattern as outlined in the documentation I
linked previously? If not then the entire message body will be loaded into
memory. Streaming large messages is a special feature and requires
different client behavior from consuming normal messages.

It would be great if I could configure maximum allowed text message size
on the consumer...

To my knowledge no such feature exists for the Core protocol. However, MQTT
5 has a feature like this if you're willing to switch clients.

There is also Qpid protonj2 which offers a streaming receiver for AMQP in which you can control the maximum amount of bytes the broker can send at any given time and read them from an InputStream which will open the transmit window as you read the data.

https://github.com/apache/qpid-protonj2/blob/main/protonj2-client-examples/src/main/java/org/apache/qpid/protonj2/client/examples/StreamingFileReceiver.java

https://qpid.apache.org/releases/qpid-protonj2-1.0.0-M23/api/index.html

Justin

On Wed, Apr 30, 2025 at 4:25 PM Alexej Timonin <alexejtimo...@gmail.com>
wrote:

Thank you for the response Justin. I get out of memory crashes when using
artemis-jakarta-client on the consumer side when the message is of type
Text.

The artemis-jakarta-client buffers the whole large message into memory if
the message is of type Text and that crashes the consumer if the message is
larger than consumers memory.

For the experiment I tried to run my consumer with 256MB memory and posted
a text message of size 300MB. I can see that it arrives as you describe as
a large message but it reads it all into memory (ActiveMQTextMessage)
before reaching user code, it all happens inside the artemis-jakarta-client
and the consumer crashes due to an out of memory error. I know the example
is extreme but that is what I want to protect my consumer against.

It would be great if I could configure maximum allowed text message size on
the consumer, so when the consumer receives messages larger than the
configured max size it throws JMS exception and the message can be subject
to DLQ policy on the broker side.

On Wed, Apr 30, 2025, 21:50 Justin Bertram <jbert...@apache.org> wrote:

If the message was sent as a "large" message or converted into a large
message by the broker (e.g. if it exceeded the journal-buffer-size) then
it
can be streamed from the broker in chunks via JMS as noted in the
documentation [1]. However, if the message is not "large" then the entire
message will be transferred to the client.


Justin

[1]


https://activemq.apache.org/components/artemis/documentation/latest/large-messages.html#streaming-over-jms
On Tue, Apr 22, 2025 at 4:14 PM Alexej Timonin <alexejtimo...@gmail.com>
wrote:

Hi!

I'm building a consumer which will be listening on text messages (I've
no
control over producers). I want to protect my consumer such that it
does
not read messages larger than 256KB to avoid crashing due to memory
limitations. Is there any way in artemis jms client implementation to
see
if a text message is larger than given size without having to load it
into
memory?

My understanding is that it's not possible when reading code of
ActiveMQTextMessage, specifically doBeforeReceive method, looks like it
loads the entire message into memory -


https://github.com/apache/activemq-artemis/blob/6f68668c867b23c7468f85c91c96a74136a561ad/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQTextMessage.java#L104
Is my understanding correct?

Thank you in advance!


--
Tim Bish


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@activemq.apache.org
For additional commands, e-mail: users-h...@activemq.apache.org
For further information, visit: https://activemq.apache.org/contact


Reply via email to