I think my try/catch is missing a catch at the end: catch (final Throwable ex) { exception = ex;
break; // fail } Rusty Wright wrote: > Ah, thanks. So if I knew how many servers my cloud is made of then I > should use that number for my MAX_RETRIES. ;-) > > I'm curious about how others are handling the exceptions. The > JDOCanRetryException is subclassed by other exceptions that don't seem > like things I'd want to retry, but perhaps I don't understand the > subtleties. Here's what I'm doing; it's an AOP gizmo, courtesy of > Spring. The pjp.proceed() is where my transaction wrapped method is > called. Looks clunky to me, given that it's not readily apparent why > it's doing what it does. > > public Object retry(final ProceedingJoinPoint pjp) throws Throwable { > this.log.debug("called"); > > JDOException exception = new JDOException("oops; too many retries"); > > int retryCount = 0; > > while (retryCount++ < this.maxRetries) { > try { > return (pjp.proceed()); > } > catch (final JDOUserException ex) { > exception = ex; > > break; // fail > } > catch (final JDOCanRetryException ex) { > exception = ex; > > // retry > } > catch (final JDOException ex) { > exception = ex; > > /** > * to quote Google's documentation: If any action > * fails due to the requested entity group being in > * use by another process, JDO throws a > * JDODataStoreException or a JDOException, caused by a > * java.util.ConcurrentModificationException. > */ > if (!(ex.getCause() instanceof > ConcurrentModificationException)) > break; // fail > > // retry > } > > this.log.debug("retryCount: {}, exception: {}", > Integer.valueOf(retryCount), > ExceptionUtils.getFullStackTrace(exception)); > } > > throw (exception); > } > > > ted stockwell wrote: >> >> On Nov 17, 2:59 pm, Rusty Wright <rwright.li...@gmail.com> wrote: >>> Is there some way to pause before retrying the database transaction? >>> If you don't, then it seems to me that the processes that are banging >>> into each other are going to keep failing. I'd like to add a pause >>> for a random amount of time in the catch block. >>> >> >> It is not necessary to pause before retrying because if a transaction >> fails with a 'RetryException' it is only because some other >> transaction was committed and that other transaction made some changes >> that are incompatible with the failed transactions changes. >> >> So... suppose you kick off 10 transactions at once. >> At *most* only 9 of those transactions will fail with a >> RetryException. >> If you retry those 9 then at *most* 8 will fail, and so on.... >> >> >> -- >> >> 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=. >> >> -- 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=.