AFAIK we need to set the redelivered flag. I remember reading it in a spec or something.
Sent from my mobile -- Asanka Abeyweera Software Engineer WSO2 Inc. Phone: +94 71 222 8648 On Mar 2, 2017 7:04 AM, "Hasitha Hiranya" <hasit...@wso2.com> wrote: > Hi Pamod and all, > > IMO, *we need both side's changes.* > > Andes client - when receover() is called, send reject to application > consumed messages, and clear internal buffer > Server - while recovering, do not increase redelivery count (do not > consider as a redelivery, as app has not consumed). Redelivery header flag > is not needed as well. > > Let us investigate and implement > > Thanks > > > On Wed, Mar 1, 2017 at 4:11 PM, Pamod Sylvester <pa...@wso2.com> wrote: > >> Hi All, >> >> Based on the issue mentioned in the $subject and described in [1] . >> Here's what we discussed, >> >> *Issue Summary* >> >> During an error, when recover() session is called by the consumer (i.e >> jms client/ESB), all unacked messages gets re-tried. This includes the >> messages which were received by the JMS consumer as well as the messages >> which were buffered in the client. >> >> As a result, the messages which were buffered in the client and which >> have not being received by the consumer get's diverted to the DLC after the >> retry count has being breached. >> >> *Problem Description* >> >> The could also be described as a gap between the AMQP and the JMS >> specifications. According to the AMQP the messages should be sent to the >> client as a batch. Though JMS provides a way to acknowledge messages >> individually. It doesn't provide a way to rollback an individual message. >> >> The only option is to recover the whole session, when the client choses >> to recover() the corresponding channel id of the client is sent to the >> broker, for it to recover all unacknowledged messages. When the server >> recovers unacked messages it will include the messages which were received >> by the JMS client as well messages which are buffered in the client and >> which were not received. >> >> *Proposed Solution* >> >> One way of solving this is through the following steps, >> >> *Andes client side changes * >> >> 1. When recover() is called from the client, distinguish the difference >> between the received messages and the messages which are buffered. We've >> done something similar for the rollback operation. >> 2. The messages which were received by the JMS client, could be >> explicitly rejected(). Sending a null ack for the message to the server. >> Since this messages need to be retried for the given number of times. >> 3. Once the rejection is sent the server will re-schedule the message >> until the max retry count is reached in the >> >> *server side changes* >> >> When session recover is called in the broker, >> >> *AndesSubscription.recoverMessages()* >> >> We could maintain a seperate flag for each *DeliverableAndesMetadata *object. >> So that when it's being re-scheduled for delivery, in the >> *MaximumNumOfDeliveryRule.evaluate() >> *would filter out these messages and will not increase the >> *maximumRedeliveryTimes >> *for the message. >> >> The above is one way we could solve the problem. Would there be any >> implications to it ? or will there be a better way of solving this? wdyt ? >> >> [1] https://wso2.org/jira/browse/MB-1887 >> >> Thanks, >> Pamod >> >> -- >> *Pamod Sylvester * >> >> *WSO2 Inc.; http://wso2.com <http://wso2.com>* >> cell: +94 77 7779495 <+94%2077%20777%209495> >> > > > > -- > *Hasitha Abeykoon* > Senior Software Engineer; WSO2, Inc.; http://wso2.com > *cell:* *+94 719363063* > *blog: **abeykoon.blogspot.com* <http://abeykoon.blogspot.com> > >
_______________________________________________ Dev mailing list Dev@wso2.org http://wso2.org/cgi-bin/mailman/listinfo/dev