Tim, I think those are fair points. Ultimately I think the JavaDoc is
relatively ambiguous, although I tend to favor your interpretation.

What does the Qpid JMS client do in this case?

BTW, I looked through the Jakarta Messaging TCK source code and I don't see
where this specific use-case is exercised.


Justin

On Wed, Nov 29, 2023 at 3:58 PM Timothy Bish <tabish...@gmail.com> wrote:

> On 11/29/23 16:15, Justin Bertram wrote:
> > It's not clear to me that this is a defect. The JavaDoc for
> > JMSContext.acknowledge() [1] says (in part):
> >
> >> This method has identical behaviour to the acknowledge method on
> Message.
> > A client may individually acknowledge each message as it is consumed, or
> it
> > may choose to acknowledge messages as an application-defined group. In
> both
> > cases it makes no difference which of these two methods is used.
> >
> > If receive() returns a null Message Object you can't invoke acknowledge
> on
> > it. Therefore, whether you use JMSContext.acknowledge() or
> > Message.acknowledge() the behavior will be identical - no message will be
> > acknowledged.
> >
> > Also, it's worth noting that messages which are not acknowledged will not
> > be lost. In most cases they will be redelivered or in some cases may be
> > sent to a dead-letter address.
>
> I believe you have skipped over the most important part of the API docs
> for that method which is the first sentence which states:
>
> "Acknowledges all messages consumed by the JMSContext's session."
>
> That would imply it works on the session level regardless of any
> successful (or not) calls to receive (or receiveBody which don't return
> actual message objects) as it is meant to work against "all message
> consumed by the JMSContext's session", not at the individual message
> level which I'd guess is indeed why it was added to the "Simplified API"
> as this would provide the entry point for  group acknowledge behavior
> described in the text.
>
> A previously read message from the 'receive' API is in fact a consumed
> message within the session regardless of whether the most recent call
> returned a message.
>
>
> >
> > Justin
> >
> > [1]
> >
> https://docs.oracle.com/javaee/7/api/javax/jms/JMSContext.html#acknowledge--
> >
> > On Wed, Nov 29, 2023 at 4:08 AM Андрей <x05...@gmail.com> wrote:
> >
> >> Hi Team,
> >>
> >> I am currently using "artemis-jakarta-client" 2.31.2 version
> >>
> >> I've stumbled into an issue with client acknowledge mode when using JMS
> >> API. Here's an example:
> >>
> >>
> >>          try (var factory = new
> ActiveMQConnectionFactory("<broker-url")) {
> >>              try (var ctx = factory.createContext("<user>",
> "<password>",
> >> JMSContext.CLIENT_ACKNOWLEDGE)) {
> >>                  var destination = ctx.createQueue("<destination>");
> >>                  try (var consumer = ctx.createConsumer(destination)) {
> >>                      var message1 = consumer.receive(100000); // suppose
> >> this call returns real message
> >>                      var message2 = consumer.receive(100000); // suppose
> >> this call times out, so NULL is returned
> >>                      ctx.acknowledge(); // I'm expecting that message1
> gets
> >> acknowledged here, but it's not happening
> >>
> >>                      /*
> >>                      Do something here....
> >>                       */
> >>
> >>                  }
> >>              }
> >>          }
> >>
> >> The reason for ack not working is that the implementation of
> >> "consumer.receive" method stores the latest returned value in JMSContext
> >> for future usage in its "acknowledge" method.
> >> This happens regardless if the value is null or not. So in case latest
> call
> >> returns null, all the previous messages get lost and never acked.
> >>
> >> This seem like a defect. Am I right?
> >>
> >> Thanks in advance
> >>
>
> --
> Tim Bish
>
>

Reply via email to