2015-04-04 3 views
1

Возможно ли использовать POJO в очередях задач App Engine? Или должны всегда значения String?Использовать POJO в движке приложения. Очередь задач

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

Что делать, если мой POJO является сложным, таким образом, что одна из полей в POJO является ArrayList?

ответ

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 КБ (поэтому максимальный размер полезной нагрузки byte[] должен быть несколько меньше). Если это для вас проблемой, вы могли бы рассмотреть припрятать в POJO как объект в хранилище и просто отправив соответствующую клавишу ...

3

Вы можете использовать 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), а затем извлекается при запуске вашей задачи.

+0

Спасибо! Это то, что я ищу, но отсутствует в [docs] (https://cloud.google.com/appengine/docs/java/taskqueue/overview-push#Java_Deferred_tasks). Из документов также важно отметить: «... необходим тщательный контроль, поскольку необработанные объекты остаются в очереди задач, даже после обновления кода приложения. Задачи, основанные на устаревшем коде приложения, не будут десериализоваться должным образом, когда задача декодируется с новыми версиями приложения ». – ruhong

Смежные вопросы