Creazione di attività push

In questa pagina viene descritto come creare attività e inserirle in code in modalità push. Quando vuoi elaborare un'attività, devi creare un nuovo oggetto attività e inserirlo in una coda. Puoi specificare esplicitamente il servizio e l'handler che elaborano l'attività e, facoltativamente, passare all'handler i dati specifici dell'attività. Puoi anche ottimizza la configurazione dell'attività, ad esempio programmando un'ora nel futuro quando deve essere eseguita o limita il numero di volte in cui vuoi che l'attività in caso di errore.

Creazione di una nuova attività in corso...

Per creare e mettere in coda un'attività, ottieni un Queue utilizzando QueueFactory e chiama il suo metodo add(). Puoi ottenere una coda denominata specificata nel file queue.xml usando il metodo getQueue() di fabbrica oppure puoi recuperare la coda predefinita utilizzando getDefaultQueue(). Puoi chiamare il metodo add() di Queue con un'istanza TaskOptions (prodotta da TaskOptions.Builder) oppure chiamarlo senza argomenti per creare un'attività con le opzioni predefinite per la coda.

import com.google.appengine.api.taskqueue.Queue;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions;
Queue queue = QueueFactory.getDefaultQueue();
queue.add(TaskOptions.Builder.withUrl("/worker").param("key", key));

Specifica del servizio worker

Quando un'attività viene rimossa dalla coda, il servizio Task Queue la inoltra a un servizio worker. Ogni attività ha un target e un url, che determinano e quale servizio e gestore eseguirà l'attività.

target

La destinazione specifica il servizio che riceverà la richiesta HTTP per eseguire l'attività. È una stringa che specifica un servizio/una versione/un'istanza uno qualsiasi dei moduli canonici. I moduli più utilizzati sono:

    service
    version.service
    instance.version.service

La stringa target viene anteposta al nome di dominio della tua app. Esistono tre modi per impostare la destinazione per un'attività:

  • Dichiara il target quando crei l'attività. Puoi impostare il target in modo esplicito quando crei l'attività impostando il parametro Intestazione Host utilizzando TaskOptions:

    taskOptions.header("Host", versionHostname)
    

  • Includi un'istruzione target quando definisci una coda nella queue.xml, come nella definizione di queue-blue. Tutte le attività aggiunte a una coda con un target utilizzeranno quel target, anche se è stato assegnato un obiettivo diverso all'attività al momento della costruzione.

  • Se non viene specificato alcun target in base a uno dei due metodi precedenti, la destinazione della task è la versione del servizio che la mette in coda. Tieni presente che se inserisci in coda un'attività dal servizio e dalla versione predefiniti in questo modo e la versione predefinita cambia prima dell'esecuzione dell'attività, questa verrà eseguita nella nuova versione predefinita.

url

url seleziona uno degli handler nel servizio di destinazione che eseguirà l'attività.

url deve corrispondere a uno dei pattern URL dell'handler nel servizio di destinazione. url può includere parametri di ricerca se il metodo specificato nell'attività è GET o PULL. Se non viene specificato alcun url, l'URL predefinito Viene utilizzato /_ah/queue/[QUEUE_NAME], dove [QUEUE_NAME] è il nome dell'attività.

Trasferimento dei dati al gestore

Puoi passare i dati all'handler come parametri di query nell'URL dell'attività, ma solo se il metodo specificato nell'attività è GET o PULL.

Il costruttore TaskOptions.Builder dispone di metodi per aggiungere dati come payload della richiesta HTTP e come parametri, che vengono aggiunti all'URL come query parametri.

params
Non specificare i parametri se utilizzi il metodo POST insieme a un payload, o se utilizzi il metodo GET e hai incluso un URL con query parametri.

Assegnare un nome a un'attività

Quando crei una nuova attività, App Engine assegna all'attività un nome univoco predefinito. Tuttavia, puoi assegnare un nome a un'attività utilizzando l'name . Un vantaggio di assegnare nomi alle tue attività è che le attività con nome vengono deduplicate, quindi puoi utilizzare i nomi delle attività garantire che un'attività venga aggiunta una sola volta. La deduplica continua per 9 giorni dopo il completamento o l'eliminazione della task.

Tieni presente che la logica di deduplicazione introduce un sovraccarico di prestazioni significativo, con conseguente aumento delle latenze e potenziali maggiori tassi di errore associate ad attività con nome. Questi costi possono essere aumentati significativamente se sono sequenziali, ad esempio con i timestamp. Pertanto, se assegni i tuoi nomi, consigliamo di utilizzare un prefisso ben distribuito per i nomi delle attività, ad esempio un hash dei contenuti.

Se assegni i tuoi nomi alle attività, tieni presente che la lunghezza massima del nome è di 500 caratteri e che il nome può contenere lettere maiuscole e minuscole, numeri, trattini bassi e trattini.

Aggiunta di attività in modo asincrono

Per impostazione predefinita, le chiamate che aggiungono attività alle code sono sincrone. Per la maggior parte in scenari diversi, le chiamate sincrone vanno bene. L'aggiunta di un'attività a una coda è in genere un'operazione rapida. Esiste una piccola percentuale di operazioni di aggiunta di attività che possono richiedere molto più tempo, ma il tempo mediano per aggiungere un'attività è inferiore a 5 ms.

L'aggiunta di operazioni a code diverse non può essere suddivisa in batch, pertanto l'API Task Queue fornisce anche chiamate asincrone che consentono di aggiungere queste attività in parallelo, riducendo ulteriormente la latenza. Questo è utile se stai creando un un'applicazione estremamente sensibile alla latenza che deve eseguire diverse attività di aggiunta operazioni su diverse code contemporaneamente.

Se vuoi effettuare chiamate asincrone a una coda di attività, utilizza i metodi asincroni forniti dalla classe Queue. Chiama get sul Future restituito per forzare il completamento della richiesta. Quando aggiungi attività in modo asincrono in una transazione, devi chiamare get() su Future prima di eseguire il commit della transazione per assicurarti che la richiesta sia stata completata.

Accodamento delle attività nelle transazioni di Cloud Datastore

Puoi accodare un'attività come parte di una transazione Datastore, ad esempio che l'attività è in coda (e la garanzia sarà accodata) solo se la transazione eseguito correttamente il commit. Attività aggiunte in un transazione sono ne viene considerata una parte e hanno lo stesso livello isolamento e coerenza.

Un'applicazione non può inserire più di cinque attività transazionali in code di attività durante un singolo transazione. Le attività di transazione non devono avere nomi specificati dall'utente.

Il seguente esempio di codice mostra come inserire attività transazionali in un Esegui coda in modalità push come parte di una transazione Datastore:

DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
Queue queue = QueueFactory.getDefaultQueue();
try {
    Transaction txn = ds.beginTransaction();

    // ...

    queue.add(TaskOptions.Builder.withUrl("/path/to/my/worker"));

    // ...
    txn.commit();
} catch (DatastoreFailureException e) {
}

Utilizzo di DeferredTasks anziché di un servizio di lavoro

L'impostazione di un gestore per ogni singola attività (come descritto sezioni) possono essere complicate, così come la serializzazione e la deserializzazione argomenti per l'attività, in particolare se si hanno a disposizione le attività da eseguire in coda. L'SDK Java include un'interfaccia chiamato DeferredTask. Questa interfaccia ti consente di definire un'attività come un . Questa interfaccia utilizza la serializzazione Java per impacchettare un'unità di lavoro in una fila di attività. Un semplice ritorno da questo metodo è considerato un successo. L'eventuale eccezione generata da questo metodo è considerata un errore.


/** A hypothetical expensive operation we want to defer on a background task. */
public static class ExpensiveOperation implements DeferredTask {

  @Override
  public void run() {
    System.out.println("Doing an expensive operation...");
    // expensive operation to be backgrounded goes here
  }
}

/**
 * Basic demonstration of adding a deferred task.
 *
 * @param request servlet request
 * @param resp servlet response
 */
@Override
public void doGet(final HttpServletRequest request, final HttpServletResponse resp)
    throws IOException {
  // Add the task to the default queue.
  Queue queue = QueueFactory.getDefaultQueue();

  // Wait 5 seconds to run for demonstration purposes
  queue.add(
      TaskOptions.Builder.withPayload(new ExpensiveOperation())
          .etaMillis(System.currentTimeMillis() + DELAY_MS));

  resp.setContentType("text/plain");
  resp.getWriter().println("Task is backgrounded on queue!");
}

Lavorare con le attività in un'applicazione multi-tenant

Per impostazione predefinita, le code push utilizzano lo spazio dei nomi corrente impostato nel gestore dello spazio dei nomi al momento della creazione dell'attività. Se la tua applicazione utilizza la multitenancy, consulta l'API Namespaces Java 8.

Passaggi successivi