Pieter,

although this looks easy its not that easy, I am aware that I can
queue a mail sending task,
problem is that task has to be idempotent to achiev desired behaviour,

a queue task can be executed for example twice, since those are
specifications
and this would result in sending mail twice,
a naive aproach would be to update some db lock to prevent sending
mail more than 1 time,
but it is not easy, this is much more complicated,
in other words operation is either atomic or it isnt, and without very
precise mechanism you
cannot prove that task will be runned only one.

My own tests proved that due to email quota being reached (task fail
and has be resheduled) some of the mails
has been send twice.

If Mail API would allowed to send mail only in case of some db
transaction success it would be very easy to garant
that mail will be send exactly 1 time. (although if it fails for some
other reasons like recipient not found or so thats whole another
story :)

Basically this can be solved by
1) adding new API for sending mail (dont know if it so easy or whole
problem isnt much much bigger than i think  - distributed
transactions ?)
2) implementing locking mechanism

On Jul 12, 9:13 pm, Pieter Coucke <pieter.cou...@onthoo.com> wrote:
> Create a task for sending e-mail instead of calling the mailservice
> directly.
>
> use this in your task (a task can be part of a transaction)
>
> try{
> ...
>
> } catch (Throwable thr) {
>  log.error(...);
> }
>
> and all exceptions will be catched.  I think a task will be re-executed only
> if it fails (throws an exception).
>
>
>
>
>
>
>
> On Sat, Jul 10, 2010 at 6:43 PM, Marcus Brody <mhrab...@gmail.com> wrote:
> > Hello,
>
> > I would like to ask, if there is some way how to send mail only in
> > case that some db transaction will be successful.
> > I am not very experienced with gae, but I did study it now for about 2
> > weeks.
>
> > Desired output:
>
> >          1) prepare email
> >          2) db transaction.begin()
> >          3) do some db operation
> >          4) bind sending mail with current transaction (similar to
> > how can you can attach Task to queue)
> >          5) db transaction.commit()
>
> > I am aware that I can queue mail sending task to task queue, but i
> > cannot find the way how to do that mail sending task Idempotent
> > without (i think) complicated locking mechanism .
> > Most simple solution would be to put mail sending task to task queue,
> > but this means mail could be send twice in some rare situation. (this
> > is maybe not that bad but if there is some way how to avoid it, I
> > would like to know)
>
> > Thank you,
>
> > Marcus
>
> > --
> > You received this message because you are subscribed to the Google Groups
> > "Google App Engine for Java" group.
> > To post to this group, send email to
> > google-appengine-j...@googlegroups.com.
> > To unsubscribe from this group, send email to
> > google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com>
> > .
> > For more options, visit this group at
> >http://groups.google.com/group/google-appengine-java?hl=en.
>
> --
> Pieter Coucke
> Onthoo BVBAhttp://www.onthoo.comhttp://www.koopjeszoeker.be

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to