 <p>You can use a <em><a href="https://cloud.google.com/appengine/docs/java/taskqueue/" rel="nofollow">deferred task</a></em> which is an object launched on a queue like a regular task. Basically, it is a different Thread which is launched through the TaskQueue options and you can pass a <strong>serializable object</strong> instead of plain http parameters.</p> <p><a href="https://cloud.google.com/appengine/docs/java/taskqueue/overview-push#Java_Deferred_tasks" rel="nofollow">https://cloud.google.com/appengine/docs/java/taskqueue/overview-push#Java_Deferred_tasks</a></p> <blockquote> <p>While the DeferredTask API is a <strong>convenient way to handle serialization</strong></p> </blockquote> <p>You need to create a class which extends <em>DeferredTask</em> (which has a constructor receiving your POJO).</p> <pre><code>public class MyDeferredTask implements DeferredTask { private MyPojo pojo; public MyDeferredTask(MyPojo pojo) { this.pojo = pojo; } @Override public void run() { // TODO Do stuff with pojo } } </code></pre> <p>and then launch the task</p> <pre><code>MyDeferredTask task = new MyDeferredTask(pojo); TaskOptions taskOptions = TaskOptions.Builder.withPayload(task); TaskManager.getQueue("my-queue").add(taskOptions); </code></pre> <p>The good thing about this is that the if the payload is greater than 100kb, the POJO is automatically persisted on the datastore (up to 1 MB, as datastore entry limit) and then retrieved when your task starts.</p>