在 App Engine 任务队列中使用 POJO
Use POJO in app engine Task Queue
是否可以在 App-Engine 任务队列中使用 POJO?或者值必须始终为字符串?
Queue queue = QueueFactory.getQueue("my_queue");
queue.add(withUrl("/my_worker").param("my_key", obj));
如果我的 POJO 很复杂,以至于 POJO 中的字段之一是 ArrayList 怎么办?
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 作为一个实体存储在数据存储区中,然后只发送相应的密钥...
您可以使用 deferred task,这是一个像常规任务一样在队列上启动的对象。基本上,它是一个通过 TaskQueue 选项启动的不同线程,您可以传递 可序列化对象 而不是普通的 http 参数。
https://cloud.google.com/appengine/docs/java/taskqueue/overview-push#Java_Deferred_tasks
While the DeferredTask API is a convenient way to handle serialization
您需要创建一个 class 来扩展 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,作为数据存储条目限制),然后在您的任务开始时检索。
是否可以在 App-Engine 任务队列中使用 POJO?或者值必须始终为字符串?
Queue queue = QueueFactory.getQueue("my_queue");
queue.add(withUrl("/my_worker").param("my_key", obj));
如果我的 POJO 很复杂,以至于 POJO 中的字段之一是 ArrayList 怎么办?
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 作为一个实体存储在数据存储区中,然后只发送相应的密钥...
您可以使用 deferred task,这是一个像常规任务一样在队列上启动的对象。基本上,它是一个通过 TaskQueue 选项启动的不同线程,您可以传递 可序列化对象 而不是普通的 http 参数。
https://cloud.google.com/appengine/docs/java/taskqueue/overview-push#Java_Deferred_tasks
While the DeferredTask API is a convenient way to handle serialization
您需要创建一个 class 来扩展 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,作为数据存储条目限制),然后在您的任务开始时检索。