Hi Vince,

On Wed, Nov 11, 2009 at 2:07 PM, Vince Bonfanti <[email protected]> wrote:

>
> Hi Nick,
>
> I'm taking this off-list for now.
>
> I've visited codereview.appspot.com, but am confused. I tried creating
> a new issue, but:
>
>  - what do I specify for "SVN base"?
>

Leave it blank if it'll let you - otherwise, use *http*://
googleappengine.googlecode.com/svn/trunk/java/


>  - it will only let me upload a patch file (not a java source file),
> but I'm not sure how to create a patch for a brand-new file?
>

Try "diff /dev/null /path/to/your/file". :)


>
> Can you offer some help? thanks.
>
> Vince
>
> On Tue, Nov 10, 2009 at 5:12 PM, Nick Johnson (Google)
> <[email protected]> wrote:
> > Hi Vince,
> > Thanks for doing this! Could you upload your code to
> codereview.appspot.com
> > and link to it from the issue? We can continue the discussion there.
> > -Nick
> >
> > On Tue, Nov 10, 2009 at 9:37 PM, Vince Bonfanti <[email protected]>
> wrote:
> >>
> >> I've faxed over the CLA and created issue #2381 for this:
> >>
> >>   http://code.google.com/p/googleappengine/issues/detail?id=2381
> >>
> >> Here are the changes I've made since the original implementation:
> >>
> >>  - The Deferrable.doTask method is now declared to throw Exception
> >> (instead of PermanentTaskFailure). This allows implementations to
> >> throw any subclass of Exception in order to have the task retried.
> >> (PermanentTaskFailure remains a subclass of Exception).
> >>
> >>  - The Deferrable.doTask method no longer takes any arguments.
> >>
> >>  - Removed the TaskHolder nested class since it's no longer needed.
> >>
> >>  - Allow an extra 240 bytes for task overhead; in testing the actual
> >> overhead was 101 bytes, so this will leave some head-room. In
> >> addition, the IllegalArgumentException that's thrown if the task size
> >> is exceeded is caught (and logged), and the task it then written to
> >> the datastore.
> >>
> >>  - An exception is logged if payload is not an instance of Deferrable.
> >>
> >>  - If the task is written to the datastore and there's a subsequent
> >> failure to queue the task, the datastore entity is deleted.
> >>
> >>  - Try twice for datatstore puts and deletes in case of
> >> DatastoreTimeoutException.
> >>
> >>  - Try twice when queuing a task in case of TransientFailureException.
> >>
> >>  - Added comments.
> >>
> >> Let me know if you have additional feedback.
> >>
> >> Vince
> >>
> >> On Sun, Nov 8, 2009 at 3:34 PM, Nick Johnson (Google)
> >> <[email protected]> wrote:
> >> > Hi Vince,
> >> >
> >> > On Sun, Nov 8, 2009 at 7:58 PM, Vince Bonfanti <[email protected]>
> >> > wrote:
> >> >>
> >> >> Hi Nick,
> >> >>
> >> >> Thanks for your feedback. Yes, I'm very interested in seeing this
> >> >> included in the official SDK. What are the steps from here?
> >> >
> >> > See this doc:
> >> >
> >> >
> http://groups.google.com/group/google-appengine/web/how-to-submit-a-patch-to-the-sdk
> >> >
> >> >>
> >> >> See responses to specific questions inserted below.
> >> >>
> >> >> Vince
> >> >>
> >> >> > - Perhaps make PermanentTaskFailure a runtime exception, which
> would
> >> >> > eliminate the need to declare it on methods that throw it.
> >> >>
> >> >> That's fine. I generally prefer checked exceptions, but if the
> >> >> AppEngine team prefers unchecked exceptions, I'm happy to make this
> >> >> change.
> >> >
> >> > I wouldn't say we prefer them in general - but personally, I think
> >> > common
> >> > uses of PermanentTaskFailure fit into the same sort of category as out
> >> > of
> >> > memory errors, divisions by zero, and so forth - they're not
> predictable
> >> > at
> >> > design-time.
> >> >>
> >> >> > - If you do the above, you could make the Deferrable interface
> extend
> >> >> > Runnable, as suggested in the meeting. I'm not sure that's
> >> >> > appropriate,
> >> >> > since the implications of Runnable are different.
> >> >>
> >> >> I think Runnable is not appropriate. I also looked at Callable, but
> in
> >> >> the end thought a new interface--Deferrable--was the best option.
> >> >
> >> > Fair enough.
> >> >
> >> >>
> >> >> > - I'm not sure there's any need to be able to pass arguments to the
> >> >> > Deferrable, since users will already have to declare a deferrable
> >> >> > class
> >> >> > and
> >> >> > instantiate it. I'm open to convincing, though.
> >> >>
> >> >> I put the arguments there to mimic the Python API and then realized
> >> >> later they're not really needed. Removing the arguments also
> >> >> simplifies the code by eliminating the need for the TaskHolder
> >> >> class--the Deferrable class could be serialized directly. I'm happy
> to
> >> >> remove the arguments if that's what the AppEngine team decides is
> >> >> best.
> >> >
> >> > Since the Java version is inevitably different due to the need for a
> >> > custom
> >> > class instead of a function object, I'd vote to drop the arguments.
> >> >
> >> >>
> >> >> > - Have you tested tasks of size exactly MaxTaskSizeBytes? At least
> in
> >> >> > Python, the actual limit seems to include some overhead that varies
> >> >> > from
> >> >> > task to task.
> >> >>
> >> >> No, I haven't tested this yet.
> >> >>
> >> >> > - If payload isn't an instance of TaskHolder, the task will
> silently
> >> >> > return
> >> >> > - it should log an error.
> >> >>
> >> >> I think the only way payload won't be an instance of TaskHolder is if
> >> >> the deserialize() method returns null, in which case an error has
> >> >> already been logged. But I'll double-check this.
> >> >
> >> > The other possibility is that something else serialized an object and
> >> > sent
> >> > it to your task handler - or possibly, that a future version of your
> own
> >> > code did so. I think logging an error (but returning a 200 status
> code)
> >> > would be the best policy, so these sorts of situations are debuggable.
> >> >
> >> > -Nick Johnson
> >> >>
> >> >> > Are you interested in having this included in the official SDK?
> >> >> > -Nick
> >> >> > On Sat, Oct 31, 2009 at 7:08 PM, Vince Bonfanti <
> [email protected]>
> >> >> > wrote:
> >> >> >>
> >> >> >> This looked like an interesting problem, and I already had most of
> >> >> >> the
> >> >> >> pieces in place, so here's my first attempt, which is implemented
> in
> >> >> >> a
> >> >> >> single class (also attached, along with some test files):
> >> >> >>
> >> >> >>
> >> >> >>
> >> >> >>
> >> >> >>
> http://code.google.com/p/gaevfs/source/browse/trunk/src/com/newatlanta/appengine/taskqueue/Deferred.java
> >> >> >>
> >> >> >> I'm more than happy to contribute this for inclusion in the SDK.
> >> >> >>
> >> >> >> Some caveats:
> >> >> >>
> >> >> >>   1) Because of issue #2097
> >> >> >> (http://code.google.com/p/googleappengine/issues/detail?id=2097),
> >> >> >> this
> >> >> >> doesn't work on the development server (it does work in
> production).
> >> >> >> So go star that issue!
> >> >> >>
> >> >> >>   2) I've only done minimal testing on the production server (see
> >> >> >> the
> >> >> >> attached test files).
> >> >> >>
> >> >> >>   3) This post is the only documentation that's currently
> available.
> >> >> >>
> >> >> >> First, add the following your your web.xml:
> >> >> >>
> >> >> >>    <servlet>
> >> >> >>        <servlet-name>Deferred</servlet-name>
> >> >> >>
> >> >> >>
> >> >> >>
> >> >> >>
>  <servlet-class>com.newatlanta.appengine.taskqueue.Deferred</servlet-class>
> >> >> >>    </servlet>
> >> >> >>    <servlet-mapping>
> >> >> >>        <servlet-name>Deferred</servlet-name>
> >> >> >>        <url-pattern>/_ah/queue/deferred</url-pattern>
> >> >> >>    </servlet-mapping>
> >> >> >>
> >> >> >> Second, define the "deferred" queue within queue.xml (use whatever
> >> >> >> rate you want):
> >> >> >>
> >> >> >>    <queue>
> >> >> >>        <name>deferred</name>
> >> >> >>        <rate>10/s</rate>
> >> >> >>    </queue>
> >> >> >>
> >> >> >> Next, create a class that implements the
> >> >> >> com.newatlanta.appengine.taskqueue.Deferred.Deferrable interface;
> >> >> >> the
> >> >> >> "doTask()" method of this class is where you implement your task
> >> >> >> logic.
> >> >> >>
> >> >> >> Then, invoke the
> com.newatlanta.appengine.taskqueue.Deferred.defer()
> >> >> >> method to queue up your task:
> >> >> >>
> >> >> >>    TestDeferred testDeferred = new TestDeferred(); // implements
> >> >> >> Deferrable
> >> >> >>    Deferred.defer( testDeferred, "one", "two", "three", 1, 2, 3 );
> >> >> >>
> >> >> >> (Note that it would be possible to pass arguments as attributes to
> >> >> >> your Deferrable instance, rather than using varargs; I'm not sure
> it
> >> >> >> makes much difference which you choose).
> >> >> >>
> >> >> >> Just as for the Python implementation, if the arguments size
> exceeds
> >> >> >> 10KB, the arguments are stored in a datastore entity, which is
> then
> >> >> >> deleted when the task is executed. Also, your doTask() method can
> >> >> >> throw a PermanentTaskFailure exception to halt retries; any other
> >> >> >> exceptions cause the task to be retried.
> >> >> >>
> >> >> >> Let me know if you find this useful, have any questions or
> encounter
> >> >> >> any problems.
> >> >> >>
> >> >> >> Vince
> >> >> >>
> >> >> >> On Fri, Oct 30, 2009 at 6:13 PM, Jason (Google)
> >> >> >> <[email protected]>
> >> >> >> wrote:
> >> >> >> > Hi David. This may be coming to Java eventually, but it hasn't
> >> >> >> > been
> >> >> >> > started
> >> >> >> > yet. If you or anyone else is interested in contributing, let me
> >> >> >> > know.
> >> >> >> >
> >> >> >> > - Jason
> >> >> >> >
> >> >> >> > On Wed, Oct 28, 2009 at 7:52 AM, David Chandler
> >> >> >> > <[email protected]>
> >> >> >> > wrote:
> >> >> >> >>
> >> >> >> >> Re: http://code.google.com/appengine/articles/deferred.html
> >> >> >> >>
> >> >> >> >> Will this be coming to AppEngine for Java?
> >> >> >> >>
> >> >> >> >> David Chandler
> >> >> >> >> http://turbomanage.wordpress.com
> >> >> >> >>
> >> >> >> >>
> >> >> >> >
> >> >> >> >
> >> >> >> > >
> >> >> >> >
> >> >> >>
> >> >> >>
> >> >> >
> >> >> >
> >> >> >
> >> >> > --
> >> >> > Nick Johnson, Developer Programs Engineer, App Engine
> >> >> > Google Ireland Ltd. :: Registered in Dublin, Ireland, Registration
> >> >> > Number:
> >> >> > 368047
> >> >> >
> >> >> > >
> >> >> >
> >> >>
> >> >>
> >> >
> >> >
> >> >
> >> > --
> >> > Nick Johnson, Developer Programs Engineer, App Engine
> >> > Google Ireland Ltd. :: Registered in Dublin, Ireland, Registration
> >> > Number:
> >> > 368047
> >> >
> >> > >
> >> >
> >>
> >>
> >
> >
> >
> > --
> > Nick Johnson, Developer Programs Engineer, App Engine
> > Google Ireland Ltd. :: Registered in Dublin, Ireland, Registration
> Number:
> > 368047
> >
> > >
> >
>
> >
>


-- 
Nick Johnson, Developer Programs Engineer, App Engine
Google Ireland Ltd. :: Registered in Dublin, Ireland, Registration Number:
368047

--~--~---------~--~----~------------~-------~--~----~
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 [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to