Java 如何使Google Appengine任务可重复?

Java 如何使Google Appengine任务可重复?,java,google-app-engine,Java,Google App Engine,这是家庭作业。通常我会使用cron做类似的事情,但老师希望我们创建一个任务队列,定期轮询服务器以获取信息 到目前为止,我有这样的想法: Queue queue = QueueFactory.getDefaultQueue(); queue.add( withUrl("/MyPage"). method(Method.GET). param("user", viewModel.getUserId())); 但这只运行一次。我怎样才能让它无限期地重复呢?你可以用不太优雅的方

这是家庭作业。通常我会使用cron做类似的事情,但老师希望我们创建一个任务队列,定期轮询服务器以获取信息

到目前为止,我有这样的想法:

Queue queue = QueueFactory.getDefaultQueue();
queue.add(
    withUrl("/MyPage").
    method(Method.GET).
    param("user", viewModel.getUserId()));

但这只运行一次。我怎样才能让它无限期地重复呢?

你可以用不太优雅的方式来做。如果您的任务因RuntimeException失败,它将自动重新启动。您可以使用配置来管理您希望它重复的频率。查看详细信息。不要使用默认队列,这一点很重要,因为您需要额外的参数


这不是安排任务的自然方式,但它对您很有效。

您可以让任务中运行的代码向队列中添加另一个任务

可以使用延迟任务重新启动任务本身

完成任务时调用deferSubmitTask()

private static class DeferredSubmitTask implements DeferredTask
{
    @Override
    public void run()
    {
        try
        {
            QueueFactory.getQueue("submitqueue").add(TaskOptions.Builder.withUrl("/tasks/submitworker").taskName("submit"));
        }
        catch (com.google.appengine.api.taskqueue.TaskAlreadyExistsException ex)
        {
            LOG.log(Level.INFO, "submit task launch failed, it is still running...");
        }
    }
}

public static void deferSubmitTask(long countdownMillis)
{
    QueueFactory.getDefaultQueue().add(TaskOptions.Builder.withPayload(new DeferredSubmitTask()).countdownMillis(countdownMillis));
}

@Gwyn Howell我特别说过我没有使用cron。我在问如何重复排队。抱歉。你看到图书馆了吗?我快速看了一眼。这似乎是任务队列的更高抽象,对吗?嗯,所以没有让任务重复的非黑客方法?这不是黑客方法。但这不是一次正常的重启。如果您将使用DefferedTask抛出异常,这将很容易,但您可以为“/MyPage”返回除200以外的HTTP代码。我想我们对hacky的定义不一样;)当所有事情都成功完成时抛出异常对我来说似乎不是一个好的做法。好主意,我认为这是一个好办法。谢谢