Thank you all for taking your time to respond to me. @Justin, no I don't
use the pattern because I don't have any control over producers, they send
text messages (3 in type header). I have come to the conclusion that I've
to use the Core API because there I can access the ClientMessage and check
if it is larger than what my client can handle, or I can just stream it and
count. The good thing about Core API is that I don't have to trust
producers and I can validate the message on a much grainer level before
receiving it, which is just not possible with artemis-jakarta-client.
Would you be interested in a PR that adds this type of control to the JMS
consumer client? This would benefit consumers that want to protect
themselves from badly configured & buggy producers. This would be specific
to artemis-jakarta-client, text message. Since it is a safety feature it
would be a configuration that consumers can set, and if the TextMessage is
above that threshold a JMSException would be thrown. I can work on this PR.

Den tors 1 maj 2025 kl 21:46 skrev Timothy Bish <tabish...@gmail.com>:

> 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