Stefano, You are *absolutely* correct! The Mail attributes get persisted and remain intact when the message is re-delivered. There was some other exception I was getting that was wiping them out... long story :)
Anyway, I have changed my process to use the Mail attributes now, and it seems to work. I need to do some more testing & clean up the code. After that, as per your suggestion, I will create a JIRA and attach the code for your review. Thanks (a lot) for your help with this. - Ajay On Thu, Aug 28, 2008 at 2:13 AM, Stefano Bagnara <[EMAIL PROTECTED]> wrote: > Ajay Chitre ha scritto: > > I got busy with other issues, so I didn't get time to look at this for a >> while. >> >> Anyway, as per Stefano's suggestion I started from RemoteDelivery and I am >> able to use most of the relevant code; but our 'process' logic is a bit >> different. This is what we would like to do: >> >> 1) We have a special processor "xyz" that uses 3 Mailets to do some >> business logic. The "root" processor sends the message "ToProcessor" xyz. >> 2) These 3 Mailets 'onMailetException' forward the mail to the new >> "retry" >> processor. >> 3) The RetryMailet of the "retry" processor, writes the message to a >> "retry" spool (similar to 'outgoing'). >> 4) When the Thread wakes up, it calls 'process(Mail)'. Everything works >> well upto this point. But here's what we want to do in the 'process' >> method: >> >> If (Max Retry count hasn't reached) >> Send the Mail back to the "xyz" processor for re-processing >> Else >> Send the Mail to the "error" processor, which will "Bounce" >> >> >> To implement this, I am trying this: >> >> if (retries < maxRetries) { >> mail.setState("xyz"); >> } else { >> mail.setState(Mail.ERROR); >> } >> >> // re-insert the mail into the spool >> MailetContext mc = getMailetContext(); >> try { >> mc.sendMail(mail); >> } catch (MessagingException e) { >> // we shouldn't get an exception, because the mail was already >> processed >> log("Exception re-inserting failed mail: ", e); >> return false; >> } >> >> Thinking that the Mail object will have all the attributes intact when the >> "xyz" processor is called. Unfortunately, nothing (apparent) happens. >> When >> I tried mail.setState(Mail.DEFAULT), the control goes to the "root" >> processor, which forwards to our "xyz" - but all the Mail attributes are >> gone, resulting in a loop. >> > > What does exactly 'forwards to our "xyz"' means? Maybe the way you use to > move the message simply loose mail attributes. > > What is the attribute being lost? > Can you check if the attribute is there in the root processor? > > Anyway, I am debugging thru the James code, but if someone can tell me if >> there's a better way to do this, that would be appreciated. Thanks. >> > > The way you do things seems fine. > Maybe you want to open a JIRA issue for this feature and attach your code > so that I can better review the code instead of trying to understand from > descriptions ;-) > > PS: Obviously, the other approach is to refactor our code such that we >> don't >> have to send it back to "xyz" processor and instead do what RemoteDelivery >> is doing, but that's our last resort - cause that requires a lot of >> refactoring of combining 3 Mailets into one. >> > > There are many ways to duplicate a Mail object. > The only one that should duplicate attributes is new MailImpl(oldmail, > "newname") or oldmail.duplicate(). > > > Stefano > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > >