Вы можете использовать deferred task который является объект, запущенный в очереди, как и обычный задача. В принципе, это другой Thread, который запускается через параметры 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);
Хорошая вещь об этом является то, что если нагрузка превышает 100 килобайт, то POJO автоматически сохраняется на датасторе (до 1 МБ, а datastore entry limit), а затем извлекается при запуске вашей задачи.
Спасибо! Это то, что я ищу, но отсутствует в [docs] (https://cloud.google.com/appengine/docs/java/taskqueue/overview-push#Java_Deferred_tasks). Из документов также важно отметить: «... необходим тщательный контроль, поскольку необработанные объекты остаются в очереди задач, даже после обновления кода приложения. Задачи, основанные на устаревшем коде приложения, не будут десериализоваться должным образом, когда задача декодируется с новыми версиями приложения ». – ruhong