Vince Bonfanti's Deferred.defer() makes using task queues very easy, as there's only one servlet needed and he's already written it! There's an example of using it and a reference to the forum thread in which Vince posted the code here:
http://turbomanage.wordpress.com/2009/11/20/deferred-defer-is-a-thing-of-beauty/ HTH, /dmc On Dec 15, 2:23 pm, Rusty Wright <[email protected]> wrote: > At this point I'd suggest that you don't do it with GWT; step into the > wayback machine and write a plain java servlet and do the necessary > configuration/mapping with your web.xml. Can you say old school? There > should be plenty of tutorials and samples on the web. > > I'm thinking that you'd extend javax.servlet.http.HttpServlet and override > its doGet() method. > > John V Denley wrote: > > Wondering if this is now really a GWT question? Anyone got any ideas? > > > On Dec 14, 10:25 am, John V Denley <[email protected]> wrote: > >> Thanks JD (slightly weird, I feel like Im writing to myself!) I think > >> we all understand what task queues are, the problem is how to actually > >> set up the functionality behind the URL > > >> I think we are getting close to a simple example, which I will post as > >> soon as I get this mechanism working. From what I can tell it works > >> something like this (which Im posing as a series of questions): > > >> Where should I put the function which extends the HttpServlet (eg > >> public class MyServletFunction extends HttpServlet {/*do something > >> useful*/} ) > >> I'm guessing it should be on the server side (eg as a new file within > >> com.myappname.server) called MyServletFunctionFile.java? > >> If so then should this be included somewhere OTHER than in the > >> myappname.gwt.xml file (eg <servlet path="/MyServletFunction" > >> class="com.myappname.server.MyServletFunctionFile"/>) > > >> Im guessing that this would then mean that in theory I could type > >> inhttp://myappname.appspot.com/MyServletFunctiontoinvoke the "/*do > >> something useful*/" code? > > >> Is there anything else I'm meant to define anywhere? Have I totally > >> misunderstood this process? If so then hopefully what Ive written here > >> illustrates the problems that some of us are having with getting our > >> head around some of these "basic" concepts! > > >> Thanks for everyones input and help so far here guys... > > >> Cheers, > >> J > > >> On Dec 14, 3:00 am, jd <[email protected]> wrote: > > >>> Hi, task queues are just a way to call a url some time in the future. > >>> As Jason mentioned above, for a tasks "handler" you should probably > >>> just create a servlet (extend HttpServlet) because you do not need to > >>> generate a nice webpage as the result of the call - no one will see > >>> it. In the HttpServlet.service(...) method write your code to > >>> actually handle the task making sure that it won't take longer than 30 > >>> seconds. This method will be called for POSTs or GETs to its url. > >>> Then you need to define the url that will call this servlet in your > >>> web.xml file. If you are just using the default queue then you should > >>> map /_ah/queue/default to your "handler" servlet. > >>> To execute your task you could either call the url directly in a > >>> browser, from your GWT client or from other server side code. But you > >>> probably want to use the TaskQueue to schedule the call for some time > >>> in the future from some other server side code like within your GWT > >>> RPC servlet. > >>> On Dec 14, 4:53 am, John VDenley<[email protected]> wrote: > >>>> Well put Rusty, thats exactly the frustration im having!!! LOL > >>>> On Dec 13, 9:42 pm, Rusty Wright <[email protected]> wrote: > >>>>> What method gets called in your code when your app receives a GET > >>>>> request? Or a POST request? I think that's what you're looking for. > >>>>> Unfortunately the documentation for these frameworks sometimes tries to > >>>>> sugar coat things and hide ("abstract away") these low level details, > >>>>> or they assume it's obvious how things work, which it may be to to some > >>>>> but not all of us. > >>>>> John VDenleywrote: > >>>>>> LOL - damn... though it shouldnt matter whats being used for the front > >>>>>> end really....maybe Im asking the wrong question!! > >>>>>> Does anyone else have any idea how to explain what the entry point is > >>>>>> within the java code, or where the code is that actually executes what > >>>>>> thetaskqueueis supposed to do? Does anyone know how to ask the > >>>>>> question Im trying to ask?! > >>>>>> On Dec 13, 8:22 pm, Rusty Wright <[email protected]> wrote: > >>>>>>> Heh, I'm on the flip side; I don't know anything about GWT. > >>>>>>> John VDenleywrote: > >>>>>>>> Thanks for this Rusty, Im not sure I understand all of it right away > >>>>>>>> (perhaps with more investigation I will work it out) > >>>>>>>> However Its worth mentioning that as far as I know Im not using > >>>>>>>> Spring > >>>>>>>> or Stripes or Struts (not even sure what any of these are!) > >>>>>>>> I am using native GWT (v2.0)/GAE(v1.2.8) and using RPC to make calls > >>>>>>>> to the server side. > >>>>>>>> I have tried creating a "public" function in my main java file (right > >>>>>>>> above the onModuleLoad() function) as follows: > >>>>>>>> public void testqueues() > >>>>>>>> { > >>>>>>>> Window.alert("hello test queues"); > >>>>>>>> } > >>>>>>>> The thinking then being that I might be able to make a call to > >>>>>>>>http://your-gae-app.appspot.com/testqueuesanditwouldshowthealert > >>>>>>>> box. (I would like to prove this in the dev environment, but Im not > >>>>>>>> sure how to do this now that the URL for that is currently > >>>>>>>>http://localhost:8888/IDeBanet.html/testqueues?gwt.codesvr=192.168.0....) > >>>>>>>> Its entirely possible that I have totally misunderstood how this is > >>>>>>>> meant to be working and if so I apologise for asking stupid > >>>>>>>> questions, > >>>>>>>> or making incorrect/confusing statements, but it seems theres no real > >>>>>>>> way of figuring out this stuff until you just try to implement it! > >>>>>>>> Ive > >>>>>>>> learnt a huge amount about web development and in particular GWT/GAE > >>>>>>>> over the last 4-5 months!! > >>>>>>>> Cheers, > >>>>>>>> J > >>>>>>>> On Dec 13, 5:46 am, Rusty Wright <[email protected]> wrote: > >>>>>>>>> I think I got the gist of it. As a test I modified the Stripes > >>>>>>>>> action bean that handles my first page and added the following to > >>>>>>>>> its @DefaultHandler method: > >>>>>>>>> finalQueuequeue= QueueFactory.getDefaultQueue(); > >>>>>>>>> queue.add(TaskOptions.Builder.url("/zugzug.zug")); // web.xml maps > >>>>>>>>> *.zug to stripes > >>>>>>>>> It's adding ataskto thequeue. > >>>>>>>>> Then I created an action bean for thegaetaskqueueautomaton to poke: > >>>>>>>>> @UrlBinding("/zugzug.zug") > >>>>>>>>> public class TaskQueueActionBean implements ActionBean { ... > >>>>>>>>> and its @DefaultHandler method contains: > >>>>>>>>> @SuppressWarnings("unchecked") > >>>>>>>>> final List headerNames = > >>>>>>>>> > >>>>>>>>> Collections.list(getContext().getRequest().getHeaderNames()); > >>>>>>>>> this.log.debug("header names: {}", headerNames); > >>>>>>>>> And then the log received: > >>>>>>>>> header names: [Content-Type, User-Agent, Referer, Host, > >>>>>>>>> X-AppEngine-QueueName, X-AppEngine-TaskName, > >>>>>>>>> X-AppEngine-TaskRetryCount, Content-Length] > >>>>>>>>> The first time I tried it I forgot to create the corresponding jsp > >>>>>>>>> view file, zugzug.jsp (which is essentially empty), and > >>>>>>>>> thetaskqueueautomaton kept retrying because stripes was returning > >>>>>>>>> an error because the jsp file was missing; lots of those log.debug > >>>>>>>>> lines in the log file. After I fixed that then it was only in > >>>>>>>>> there once for each time I went to my first page. > >>>>>>>>> The first page action bean enqueued thetask, thetaskqueueautomaton > >>>>>>>>> sent an http request to the url zugzug.zug, then the > >>>>>>>>> TaskQueueActionBean was invoked and its success caused the > >>>>>>>>> automaton to dequeue thetask(but not if it returned an error; then > >>>>>>>>> the automaton retries). > >>>>>>>>> Rusty Wright wrote: > >>>>>>>>>> The docs say "The defaultqueuewill call the request handler at the > >>>>>>>>>> URL > >>>>>>>>>> /worker ..." So it sounds to me that if you were, forexample, > >>>>>>>>>> using > >>>>>>>>>> Spring MVC, and had a Spring controller with > >>>>>>>>>> @Controller > >>>>>>>>>> @RequestMapping("/worker") > >>>>>>>>>> public final class WorkerController { > >>>>>>>>>> �...@requestmapping(method = RequestMethod.GET) > >>>>>>>>>> public String handleGetRequest(final ModelMap model) { > >>>>>>>>>> this.log.debug("called"); > >>>>>>>>>> return (null); > >>>>>>>>>> } > >>>>>>>>>> } > >>>>>>>>>> then it would call your handleGetRequest() method 5 times a > >>>>>>>>>> second, by > >>>>>>>>>> sending an http GET (or POST?) request to your /worker url each > >>>>>>>>>> time. > >>>>>>>>>> Similarly, with Stripes (and for Struts 2 probably something > >>>>>>>>>> similar) it > >>>>>>>>>> would be something like > >>>>>>>>>> @UrlBinding("/worker") > >>>>>>>>>> public class WorkerActionBean implements ActionBean { > >>>>>>>>>> �...@defaulthandler > >>>>>>>>>> public Resolution handleRequest() { > >>>>>>>>>> this.log.debug("called"); > >>>>>>>>>> return (null); > >>>>>>>>>> } > >>>>>>>>>> } > >>>>>>>>>> I'm returning null because I don't know what thetaskqueuething does > >>>>>>>>>> with what it gets back (I didn't read much of their docs; to tell > >>>>>>>>>> the > >>>>>>>>>> truth, I stopped at that sentence I quoted at the top because it > >>>>>>>>>> sounds > >>>>>>>>>> very similar to their cron thing, which docs I did read most of). > >>>>>>>>>> I'm > >>>>>>>>>> undoubtedly also lacking the code needed to pull the nexttaskoff > >>>>>>>>>> the > >>>>>>>>>> queueand do something with it. > >>>>>>>>>> I'm assuming that you have some web framework in front of > >>>>>>>>>> everything and > >>>>>>>>>> thus don't need a servlet mapping in your web.xml for the /worker > >>>>>>>>>> url > >>>>>>>>>> since the web framework is handling the url mapping. > >>>>>>>>>> So they're "pinging" your /worker url using a plain old http > >>>>>>>>>> request to > >>>>>>>>>> initiate running eachtask; your controller or action bean is what > >>>>>>>>>> performs thetask. Think of it like you typed in your browser's > >>>>>>>>>> address > >>>>>>>>>> boxhttp://your-gae-app.appspot.com/worker?task_queue_params_go_hereor > >>>>>>>>>> you used the command line programs cURL or wget. > >>>>>>>>>> If I understand this correctly then I would say that their > >>>>>>>>>> sentence I > >>>>>>>>>> quoted isn't as clear as it could be. Given the way it's stated, > >>>>>>>>>> is the > >>>>>>>>>> taskqueuereally > > ... > > read more » -- 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.
