Como executar um trabalho na instância líder no AEM as a Cloud Service
Saiba como executar um trabalho na instância líder no serviço de Autor do AEM como parte do AEM as a Cloud Service e entenda como configurá-lo para ser executado apenas uma vez.
Os trabalhos do Sling são tarefas assíncronas que operam em segundo plano, projetadas para lidar com eventos acionados pelo usuário ou pelo sistema. Por padrão, essas tarefas são distribuídas igualmente por todas as instâncias (pods) no cluster.
Para obter mais informações, consulte Evento do Apache Sling e manuseio de trabalhos.
Criar e processar trabalhos
Para fins de demonstração, vamos criar um trabalho simples que instrui o processador do trabalho a registrar uma mensagem.
Criar um trabalho
Use o código abaixo para criar um trabalho do Apache Sling:
package com.adobe.aem.guides.wknd.core.sling.jobs.impl;
import java.util.HashMap;
import java.util.Map;
import org.apache.sling.event.jobs.JobManager;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component(immediate = true)
public class SimpleJobCreaterImpl {
private static final Logger log = LoggerFactory.getLogger(SimpleJobCreaterImpl.class);
// Define the topic on which the job will be created
protected static final String TOPIC = "wknd/simple/job/topic";
// Inject a JobManager
@Reference
private JobManager jobManager;
@Activate
protected final void activate() throws Exception {
log.info("SimpleJobCreater activated successfully");
createJob();
log.info("SimpleJobCreater created a job");
}
private void createJob() {
// Create a job and add it on the above defined topic
Map<String, Object> jobProperties = new HashMap<>();
jobProperties.put("action", "log");
jobProperties.put("message", "Job metadata is: Created in activate method");
jobManager.addJob(TOPIC, jobProperties);
}
}
Os pontos principais a serem observados no código acima são:
- A carga do trabalho tem duas propriedades:
actionemessage. - Usando o método do JobManager
addJob(...), o trabalho é adicionado ao tópicowknd/simple/job/topic.
Processar um trabalho
Use o código abaixo para processar o trabalho do Apache Sling acima:
package com.adobe.aem.guides.wknd.core.sling.jobs.impl;
import org.apache.sling.event.jobs.Job;
import org.apache.sling.event.jobs.consumer.JobConsumer;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component(service = JobConsumer.class, property = {
JobConsumer.PROPERTY_TOPICS + "=" + SimpleJobCreaterImpl.TOPIC
}, immediate = true)
public class SimpleJobConsumerImpl implements JobConsumer {
private static final Logger log = LoggerFactory.getLogger(SimpleJobConsumerImpl.class);
@Override
public JobResult process(Job job) {
// Get the action and message properties
String action = job.getProperty("action", String.class);
String message = job.getProperty("message", String.class);
// Log the message
if ("log".equals(action)) {
log.info("Processing WKND Job, and {}", message);
}
// Return a successful result
return JobResult.OK;
}
}
Os pontos principais a serem observados no código acima são:
- A classe
SimpleJobConsumerImplimplementa a interfaceJobConsumer. - É um serviço registrado para consumir trabalhos do tópico
wknd/simple/job/topic. - O método
process(...)processa o trabalho registrando a propriedademessageda carga do trabalho.
Processamento de trabalho padrão
Quando você implanta o código acima em um ambiente do AEM as a Cloud Service e o executa no serviço AEM Author, que opera como um cluster com várias JVMs de Autor do AEM, o trabalho será executado uma vez em cada instância (pod) do Autor do AEM, o que significa que o número de trabalhos criados corresponderá ao número de pods. O número de pods sempre será maior que um (para ambientes não-RDE), mas flutuará com base no gerenciamento de recursos internos da AEM as a Cloud Service.
O trabalho é executado em cada instância do AEM Author (pod) porque o wknd/simple/job/topic está associado à fila principal do AEM, que distribui trabalhos em todas as instâncias disponíveis.
Isso geralmente é problemático se o trabalho for responsável por alterar o estado, como criar ou atualizar recursos ou serviços externos.
Se você quiser que o trabalho seja executado apenas uma vez no serviço AEM Author, adicione a configuração da fila de trabalhos descrita abaixo.
Você pode verificá-lo revisando os logs do serviço de Autor do AEM no Cloud Manager.
Você deve ver:
<DD.MM.YYYY HH:mm:ss.SSS> [cm-pxxxx-exxxx-aem-author-68775db964-nxxcx] *INFO* [sling-oak-observation-15] org.apache.sling.event.impl.jobs.queues.JobQueueImpl.<main queue> Starting job queue <main queue>
<DD.MM.YYYY HH:mm:ss.SSS> INFO [com.adobe.aem.guides.wknd.core.sling.jobs.impl.SimpleJobConsumerImpl] Processing WKND Job, and Job metadata is: Created in activate method
<DD.MM.YYYY HH:mm:ss.SSS> [cm-pxxxx-exxxx-aem-author-68775db964-r4zk7] *INFO* [sling-oak-observation-11] org.apache.sling.event.impl.jobs.queues.JobQueueImpl.<main queue> Starting job queue <main queue>
<DD.MM.YYYY HH:mm:ss.SSS> INFO [com.adobe.aem.guides.wknd.core.sling.jobs.impl.SimpleJobConsumerImpl] Processing WKND Job, and Job metadata is: Created in activate method
Há duas entradas de log, uma para cada instância de Autor do AEM (68775db964-nxxcx e 68775db964-r4zk7), indicando que cada instância (pod) processou o trabalho.
Como executar uma tarefa na instância líder
Para executar um trabalho apenas uma vez no serviço AEM Author, crie uma nova fila de trabalhos do Sling do tipo Ordenado e associe seu tópico de trabalho (wknd/simple/job/topic) a essa fila. Com essa configuração, somente a instância líder do autor do AEM (pod) poderá processar a tarefa.
No módulo ui.config do projeto do AEM, crie um arquivo de configuração OSGi (org.apache.sling.event.jobs.QueueConfiguration~wknd.cfg.json) e armazene-o na pasta ui.config/src/main/content/jcr_root/apps/wknd/osgiconfig/config.author.
{
"queue.name":"WKND Queue - ORDERED",
"queue.topics":[
"wknd/simple/job/topic"
],
"queue.type":"ORDERED",
"queue.retries":1,
"queue.maxparallel":1.0
}
Os principais pontos a serem observados na configuração acima são:
- O tópico da fila está definido como
wknd/simple/job/topic. - O tipo de fila está definido como
ORDERED. - O número máximo de trabalhos paralelos está definido como
1.
Depois de implantar a configuração acima, a tarefa será processada exclusivamente pela instância líder, garantindo que seja executada apenas uma vez em todo o serviço do AEM Author.
<DD.MM.YYYY HH:mm:ss.SSS> [cm-pxxxx-exxxx-aem-author-7475cf85df-qdbq5] *INFO* [FelixLogListener] Events.Service.org.apache.sling.event Service [QueueMBean for queue WKND Queue - ORDERED,7755, [org.apache.sling.event.jobs.jmx.StatisticsMBean]] ServiceEvent REGISTERED
<DD.MM.YYYY HH:mm:ss.SSS> INFO [com.adobe.aem.guides.wknd.core.sling.jobs.impl.SimpleJobConsumerImpl] Processing WKND Job, and Job metadata is: Created in activate method
<DD.MM.YYYY HH:mm:ss.SSS> [com.adobe.aem.guides.wknd.core.sling.jobs.impl.SimpleJobConsumerImpl] Processing WKND Job, and Job metadata is: Created in activate method