我对Java DeferredTask的文档感到有点困惑。我在这里阅读了Python文档:http://code.google.com/appengine/articles/deferred.html但我还不清楚我是如何使用Java版本的。
您是否可以提供启动DeferredTask的工作示例代码,以便使用DatastoreService进行简单的写入?
答案 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
异常停止 重试;任何其他异常都会导致重试任务。
一些奖金链接: