> 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.


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!
> > >
> >
>

Reply via email to