Questa pagina descrive come creare le attività e inserirle nelle 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 perfezionare la configurazione dell'attività, ad esempio pianificare un momento futuro in cui deve essere eseguita o limitare il numero di volte in cui vuoi che venga eseguito un nuovo tentativo in caso di errore.
Creazione di una nuova attività
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
utilizzando il metodo getQueue()
della factory oppure puoi ottenere 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.
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 il servizio e l'handler che alla fine eseguiranno l'attività.
target
La destinazione specifica il servizio che riceverà la richiesta HTTP per eseguire l'attività. Si tratta di una stringa che specifica un servizio/una versione/un'istanza in uno dei formati 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 esplicitamente durante la creazione dell'attività impostando l'
Host
intestazione utilizzandoTaskOptions
:taskOptions.header("Host", versionHostname)
Includi un'istruzione
target
quando definisci una coda inqueue.xml
, come nella definizione diqueue-blue
. Tutte le attività aggiunte a una coda con untarget
utilizzeranno questo target, anche se all'attività è stato assegnato un target diverso al momento della creazione.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 url
, viene utilizzato l'URL predefinito
/_ah/queue/[QUEUE_NAME]
, dove [QUEUE_NAME]
è il nome della fila della task.
Trasferimento dei dati all'handler
Puoi passare i dati all'handler come parametri di ricerca nell'URL dell'attività, ma solo se il metodo specificato nell'attività è GET
o PULL
.
Il costruttore TaskOptions.Builder
ha metodi per aggiungere i dati come payload della richiesta HTTP e come parametri, che vengono aggiunti all'URL come parametri di query.
params
- Non specificare params se utilizzi il metodo
POST
insieme a un payload o se utilizzi il metodoGET
e hai incluso un URL con parametri di query.
Assegnare un nome a un'attività
Quando crei una nuova attività, App Engine assegna un nome univoco per impostazione predefinita. Tuttavia, puoi assegnare il tuo nome a un'attività utilizzando il parametro name
. Un vantaggio dell'assegnazione di nomi alle attività è che le attività con nome vengono eliminate, il che significa che puoi utilizzare i nomi delle attività per 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 deduplica introduce un overhead significativo delle prestazioni, con un conseguente aumento delle latenze e potenzialmente dei tassi di errore associati alle attività con nome. Questi costi possono aumentare notevolmente se i nomi delle attività 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 degli scenari, le chiamate sincrone funzionano correttamente. 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.
Le operazioni di aggiunta di attività a code diverse non possono essere raggruppate, pertanto l'API Task Queue fornisce anche chiamate asincrone che ti consentono di aggiungere queste attività in parallelo, riducendo ulteriormente questa latenza. Questa operazione è utile se stai creando un'applicazione estremamente sensibile alla latenza che deve eseguire contemporaneamente diverse operazioni di aggiunta di attività a code diverse.
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.
Inserimento in coda delle attività nelle transazioni Cloud Datastore
Puoi mettere in coda un'attività nell'ambito di una transazione di Datastore, in modo che venga messa in coda solo (e sia garantito che venga messa in coda) se la transazione viene eseguita correttamente. Le attività aggiunte in una transazione sono considerate parte di essa e hanno lo stesso livello di isolamento e coerenza.
Un'applicazione non può inserire più di cinque attività di transazione nelle code di lavoro durante una singola transazione. Le attività di transazione non devono avere nomi specificati dall'utente.
Il seguente esempio di codice mostra come inserire attività transazionali in una coda in modalità push nell'ambito 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
La configurazione di un gestore per ogni attività distinta (come descritto nelle sezioni precedenti) può essere complicata, così come la serializzazione e la deserializzazione di argomenti complessi per l'attività, in particolare se hai molte attività diverse, ma piccole, da eseguire nella coda. L'SDK Java include un'interfaccia chiamata DeferredTask. Questa interfaccia ti consente di definire un'attività come un singolo metodo. Questa interfaccia utilizza la serializzazione Java per impacchettare un'unità di lavoro in una fila di attività. Un semplice ritorno da questo metodo viene considerato un successo. L'eventuale eccezione generata da questo metodo è considerata un errore.
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
- Scopri come creare gestori compiti.