Hello Robbie,
I think I wasn't clear enough. So let me explain. JMS ----------- Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageConsumer consumer = session.createConsumer(session.createQueue("queue.name")); consumer.receive(); In the above code, when "receive" returns the message is no longer present on the broker. This is guaranteed. Is this statement correct? Proton-c -------------- on_message() When on_message finished processing, I have no guarantee the message is no longer present on the broker as above. In the reactor code, the message disappears from the broker when PN_REACTOR_QUIESCED event is handled after the message was received (disposition event is sent to the broker). So my question here is how can I replicate the JMS behavior? Regards, Adel ________________________________ From: Robbie Gemmell <robbie.gemm...@gmail.com> Sent: Thursday, November 17, 2016 4:26 PM To: users@qpid.apache.org Subject: Re: [Proton-c] [C++ bindings][0.14.0] How do I know a message was settled by the receiver? On 17 November 2016 at 14:39, Adel Boutros <adelbout...@live.com> wrote: > Thank you Alan for your response! However, I am still a bit lost. > > > So you are saying that today there is no way to guarantee that a received > message has been settled without having to treat duplication. Is that correct? > > > I still have 2 questions then: > > 1. When will messaging_handler::on_delivery_settle be called? > My guess is it wont currently, if the client settles the message while it accepts then the delivery is settled as far as the client is concerned. > 2. How does Qpid JMS guarantee the settlement of the received messages > knowing it is based on proton-j which behaves to some extent the same way > proton-c does? > It doesnt behave any differently than described above/previous mail. The client settles it when accepting then thats it, the message is settled as far as the client is concerned. > Regards, > > Adel > > ________________________________ > From: Alan Conway <acon...@redhat.com> > Sent: Thursday, November 17, 2016 3:22:17 PM > To: users@qpid.apache.org > Subject: Re: [Proton-c] [C++ bindings][0.14.0] How do I know a message was > settled by the receiver? > > On Thu, 2016-11-17 at 08:41 +0000, Adel Boutros wrote: >> I would like to add a bit of context. My C++ client has a method >> called "receiveTextMessage()". This method is supposed to simulate >> what JMS.receiveMessage() does which is block until a message is >> received and settled. >> >> >> So, I am using wait/notify mechanism to unblock my consumer when the >> message is settled and no longer available on the broker. >> >> It seems in the code, when the auto_accept is set to true (default >> behavior), there is no way to be notified when the delivery is >> settled and only on_message will be called >> (proton::messaging_adapter.cpp). > > auto-accept() is no different from calling accept() at the end of your > on_message() - feel free to turn it off if you want more control. > > auto vs. manual doesn't change the events you see. It depends on how > your receiver delivery_mode: > > AT_MOST_ONCE: sent pre-settled, unreliable, fire-and-forget. > > AT_LEAST_ONCE: receiver-settles-first: receiver settles before sending > accept, will not get any notification of outcome. There may be > duplicates if accepts are lost. > > AMQP also offers: receiver-settles-second - this is the most reliable > "3-way-ack" receiver sends accept but doesn't settle, sender settles on > getting accept, receiver settles after sender. This can be used to > implement the holy grail of "EXACTLY_ONCE" but it requires a lot of > state to be tracked. Proton doesn't have built-in support for it and > the C++ API lacks a delivery_mode to set it (but that's easy to fix) > >> In that case, between the time MyHandler::on_message is called and >> the time where the message is settled (d.accept() in the below code), >> can't anything go wrong? > > Yes, the network can break and you have no idea if the accept made it > which means you re-queue the message and may potentially send a > duplicate. This is acceptable for AT_LEAST_ONCE, the application needs > to handle de-duplication (that's the part that's hard to do in a > generic and efficient way) > >> PS: As the event_loop has performance issues, I am using the >> timerTask and schedule for the interaction between the consumer main >> thread and the handler thread. > > Thanks, the issue will be fixed I promise. > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@qpid.apache.org > For additional commands, e-mail: users-h...@qpid.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@qpid.apache.org For additional commands, e-mail: users-h...@qpid.apache.org