Java GAE DeferredTask示例?

时间:2011-09-21 18:55:26

标签: java google-app-engine

我对Java DeferredTask的文档感到有点困惑。我在这里阅读了Python文档:http://code.google.com/appengine/articles/deferred.html但我还不清楚我是如何使用Java版本的。

您是否可以提供启动DeferredTask的工作示例代码,以便使用DatastoreService进行简单的写入?

2 个答案:

答案 0 :(得分:13)

要使用延迟,首先必须定义一个包含要运行的代码的类:

class MyDeferred implements DeferredTask {
    @Override
    public void run() {
        // Do something interesting
    }
};

就像任何其他可序列化的类一样,您可以拥有存储有关任务的相关信息的本地人员。然后,要运行任务,请实例化类的实例并将其传递给任务队列API:

MyDeferred task = new MyDeferred();
// Set instance variables etc as you wish
Queue queue = QueueFactory.getDefaultQueue();
queue.add(withPayload(task));

您甚至可以为您的任务使用匿名内部类,但要注意注释here中描述的警告。

答案 1 :(得分:1)

Java延迟库仍然不在GAE SDK中,这就是您找不到任何官方文档的原因。 此功能请求自2011年3月起修复,您现在可以使用延迟库straight from the Sdk

您可以使用可用的here的Vince Bonfanti延迟库。

库的使用非常简单,在doc:

中有很好的解释
  

1)需要配置延迟任务处理程序(servlet)   在web.xml内   请注意,init-param必须与实际匹配   url-pattern的:

   <servlet>
     <servlet-name>Deferred</servlet-name>
     <servlet-class>com.newatlanta.appengine.taskqueue.Deferred</servlet-class>
       <init-param>
           <param-name>url-pattern</param-name>
           <param-value>/worker/deferred</param-value>
       </init-param>
       <load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
       <servlet-name>Deferred</servlet-name>
       <url-pattern>/worker/deferred</url-pattern>
   </servlet-mapping>
  

2)需要在queue.xml内配置“延迟”队列(使用   无论你想要什么样的速度。)   如果在defer()方法中使用可选队列名称,请创建   具有适当名称的队列。

   <queue>
       <name>deferred</name>
       <rate>10/s</rate>
   </queue>
  

3)创建一个实现该类的类   com.newatlanta.appengine.taskqueue.Deferred.Deferrable interface;
  此类的doTask方法是您实现任务的地方   逻辑。

     

4)调用Deferred.defer方法排队任务:

   DeferredTask task = new DeferredTask(); // implements Deferrable
   Deferred.defer( task );
  

如果任务大小超过10KB,则任务选项存储在a中   数据存储区实体,在执行任务时删除。

     

您的doTask方法可以抛出PermanentTaskFailure异常停止   重试;任何其他异常都会导致重试任务。

一些奖金链接: