在app引擎任务队列中使用POJO

时间:2015-04-04 21:16:41

标签: java google-app-engine task-queue

是否可以在App-Engine任务队列中使用POJO?或者值必须始终为String?

Queue queue = QueueFactory.getQueue("my_queue");
queue.add(withUrl("/my_worker").param("my_key", obj));

如果我的POJO很复杂,那么POJO中的一个字段是一个ArrayList会怎样?

2 个答案:

答案 0 :(得分:3)

TaskOptions' param方法有两个重载:一个采用String,另一个采用byte[]。 POJO实施java.io.Serializable,因此您可以将其中一个序列化为byte[],如Java Serializable Object to Byte Array所示(并在接收时将byte[]反序列化)。

每个https://cloud.google.com/appengine/docs/python/taskqueue/overview-push#Python_Quotas_and_limits_for_push_queues的最大任务大小为100 KB(因此byte[]有效负载的最大大小必须略小于此值。如果这对您来说是个问题,您可以考虑将POJO存储为数据存储区中的实体并只发送相应的密钥......

答案 1 :(得分:3)

您可以使用 deferred task ,这是一个像常规任务一样在队列中启动的对象。基本上,它是通过TaskQueue选项启动的不同线程,您可以传递可序列化对象而不是普通的http参数。

https://cloud.google.com/appengine/docs/java/taskqueue/overview-push#Java_Deferred_tasks

  

DeferredTask API是处理序列化的便捷方式

你需要创建一个扩展 DeferredTask 的类(它有一个构造函数接收你的POJO)。

public class MyDeferredTask implements DeferredTask {

    private MyPojo pojo;

    public MyDeferredTask(MyPojo pojo) {
        this.pojo = pojo;
    }

    @Override
    public void run() {
        // TODO Do stuff with pojo
    }
}

然后启动任务

MyDeferredTask task = new MyDeferredTask(pojo);
TaskOptions taskOptions = TaskOptions.Builder.withPayload(task);
TaskManager.getQueue("my-queue").add(taskOptions);

好处是,如果有效负载大于100kb,则POJO会自动保留在数据存储区中(最多1 MB,作为数据存储区条目限制),然后在任务开始时检索。