Issue #2097 still exists on the development server; however, I just committed a workaround. This workaround has a dependency on Apache Commons Codec:
http://commons.apache.org/codec/ I'm not aware of any issues in production. For convenience, here's the link again to the source: http://code.google.com/p/gaevfs/source/browse/trunk/src/com/newatlanta/appengine/taskqueue/Deferred.java <http://code.google.com/p/gaevfs/source/browse/trunk/src/com/newatlanta/appengine/taskqueue/Deferred.java>Let me know if you have any problems (or if you're using it successfully--positive feedback is always welcomed!). Vince On Fri, Jan 1, 2010 at 1:42 AM, John Howe <[email protected]> wrote: > I greatly appreciate the work that has been done here. But let me ask my > question another way. Is it known that this does not work? > > > On Thu, Dec 31, 2009 at 5:19 PM, John Howe <[email protected]> wrote: > >> I can't seem to find any additional postings on this topic and I'm not >> sure what the conclusion for being able to use the Deferred capability >> with the latest Java SDK release. I'm just wondering if Vince's >> solution works on both server and development environments. >> >> On Dec 16, 10:42 am, David Chandler <[email protected]> wrote: >> > Thanks, Vince. >> > >> > Regarding a way to access the Guice injector, I've figured out I can >> > simply create and access the injector via a static factory, so no >> > changes are needed to Deferred or Deferrable. This works for AppEngine >> > since there is only one WAR per JVM. If there were more than web app, >> > I'm not sure whether Guice ServletModules would work, but that's not >> > an issue for now. >> > >> > /dmchttp://turbomanage.wordpress.com >> > >> > On Dec 2, 2:47 pm, Vince Bonfanti <[email protected]> wrote: >> > >> > >> > >> > > The behavior you're reporting is exactly the opposite of what I'm >> seeing. >> > > For me, deserialization always fails on the dev server and always >> works in >> > > production. What I'm seeing on the dev server is that the bytes >> retrieved >> > > from the task payload (req.getInputStream) are not the same bytes that >> are >> > > sent; the result is the StreamCorruptedException. Again, though, I >> only see >> > > this on the dev server and never in production. Can you send me an >> example >> > > that fails in production? I'd like to understand what's going on >> before >> > > applying the Base64 encoder workaround. >> > >> > > I'm not at all familiar with Guice, but I think I understand what >> you're >> > > trying to do. One thought I've had is that we could pass the >> > > HttpServletRequest object to the doTask() method. This would allow you >> to >> > > add attributes (objects) to the HttpServletRequest within your Guice >> filter >> > > and then retrieve them within your doTask() method. >> > >> > > Vince >> > >> > > On Fri, Nov 27, 2009 at 7:53 PM, David Chandler < >> [email protected]>wrote: >> > >> > > > I've solved the serialization problems by Base64 encoding the >> > > > serialized task before calling payload() and decoding it in the >> > > > deserialize(HttpServletRequest) method. I'm guessing something in >> the >> > > > task queue chain (either task queue payload storage or the servlet >> > > > call when task is run) has problems transmitting the binary data, as >> > > > the exception I was getting at one point was a >> > > > java.io.StreamCorruptedException. >> > >> > > > I'll send another patch to Vince. My solution works, but I'm not >> > > > completely satisfied that I've diagnosed the problem correctly. I >> used >> > > > Apache commons-codec for Base64. Is it safe to use com.sun.misc >> > > > instead? I see it in appengine.repackaged chain, as well, but don't >> > > > see it as part of an official Google API. >> > >> > > > Somewhat related, I've wired up the Deferred servlet through the >> > > > GuiceFilter so I can pass a Guice injector to Deferrable tasks. >> Since >> > > > the task objects are not created through Guice, but rather by >> > > > deserializing, I modified doTask() to accept an additional Injector >> > > > argument. We probably don't want that in the official version of >> > > > Deferrable, though. >> > >> > > > Is there a better way for my Deferrable classes to get access to a >> > > > Guice "context"? I'm trying to avoid Guice.createInjector(), as it >> > > > results in a duplicate PersistenceManagerFactory being created since >> > > > other servlets are also being served through Guice. >> > >> > > > Thank you, >> > > > /dmc >> > >> > > > On Nov 27, 5:42 pm, David Chandler <[email protected]> wrote: >> > > > > Jeff, >> > >> > > > > I'm seeing problems with deserialization, too, when deployed on >> > > > > AppEngine. In dev, I can deserialize(serialize(task)) and it works >> > > > > just fine, but not so in AppEngine. I get the same error whether >> the >> > > > > task payload is the serialized Deferrable task itself or just the >> Key >> > > > > with the task in the db, but I haven't yet figured out which is >> the >> > > > > cause of the problem. >> > >> > > > > The error I'm getting on AppEngine is invalid type code: 00 in >> > > > > Deferred.deserialize method. I've tried Base64 encoding after >> > > > > serialization in case it's related to special binary escape >> sequences >> > > > > that happen to be in the serialized object stream but still no >> > > > > success. >> > >> > > > > I'm pretty sure AppEngine has written some custom code to do >> > > > > serialization because I previously got an AppEngine acess control >> > > > > exception when calling enableResolveObject(true) in a subclass of >> > > > > ObjectInputStream, and I'm wondering if that's in play somehow... >> > >> > > > > /dmc >> >> -- >> >> 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]<google-appengine-java%[email protected]> >> . >> For more options, visit this group at >> http://groups.google.com/group/google-appengine-java?hl=en. >> >> >> > -- > 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]<google-appengine-java%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/google-appengine-java?hl=en. > -- 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.
