Criando e Consumindo Trabalhos para Descarregamento

O recurso Apache Sling Discovery fornece uma API Java que permite criar trabalhos do JobManager e serviços do JobConsumer que os consomem.

Para obter informações sobre como criar topologias de descarga e configurar o consumo de tópicos, consulte Descarregamento de Tarefas.

Tratamento de cargas de trabalho

A estrutura de descarga define duas propriedades de job que você usa para identificar a carga da ordem de produção. Os agentes de replicação de descarga usam essas propriedades para identificar os recursos a serem replicados para as instâncias na topologia:

  • offloading.job.input.payload: Uma lista separada por vírgulas de caminhos de conteúdo. O conteúdo é replicado para a instância que executa o trabalho.
  • offloading.job.output.payload: Uma lista separada por vírgulas de caminhos de conteúdo. Quando a execução da tarefa é concluída, a carga da tarefa é replicada para esses caminhos na instância que criou a tarefa.

Use a enumeração OffloadingJobProperties para fazer referência aos nomes das propriedades:

  • OffloadingJobProperties.INPUT_PAYLOAD.propertyName()
  • OffloadingJobProperties.OUTPUT_PAYLOAD.propetyName()

Os trabalhos não exigem cargas úteis. No entanto, a carga é necessária se a tarefa exigir a manipulação de um recurso e a tarefa for descarregada para um computador que não criou a tarefa.

Criando Tarefas para Descarregamento

Crie um cliente que chame o método JobManager.addJob para criar um trabalho que é executado por um JobConsumer selecionado automaticamente. Forneça as seguintes informações para criar a tarefa:

  • Tópico: O tópico do trabalho.
  • Nome: (Opcional)
  • Mapa de propriedades: Um objeto Map<String, Object> que contém qualquer número de propriedades, como caminhos de carga de entrada e caminhos de carga de saída. Este objeto Map está disponível para o objeto JobConsumer que executa a tarefa.

O serviço de exemplo a seguir cria uma tarefa para um determinado tópico e caminho de carga de entrada.

package com.adobe.example.offloading;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.apache.felix.scr.annotations.Reference;

import java.util.HashMap;

import org.apache.sling.event.jobs.Job;
import org.apache.sling.event.jobs.JobManager;

import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.api.resource.ResourceResolver;

import com.adobe.granite.offloading.api.OffloadingJobProperties;

@Component
@Service
public class JobGeneratorImpl implements JobGenerator  {

 @Reference
 private JobManager jobManager;
 @Reference ResourceResolverFactory resolverFactory;

 public String createJob(String topic, String payload) throws Exception {
  Job offloadingJob;

  ResourceResolver resolver = resolverFactory.getResourceResolver(null);
  if(resolver.getResource(payload)!=null){

   HashMap<String, Object> jobprops = new HashMap<String, Object>();
   jobprops.put(OffloadingJobProperties.INPUT_PAYLOAD.propertyName(), payload);

   offloadingJob = jobManager.addJob(topic, null, jobprops);
  } else {
   throw new Exception("Payload for job cannot be found");
  }
  if (offloadingJob == null){
   throw new Exception ("Offloading job could not be created");
  }
  return offloadingJob.getId();
 }
}

O log contém a seguinte mensagem quando JobGeneratorImpl.createJob é chamado para o tópico com/adobe/example/offloading e a carga /content/geometrixx/de/services:

10.06.2013 15:43:33.868 *INFO* [JobHandler: /etc/workflow/instances/2013-06-10/model_1554418768647484:/content/geometrixx/en/company] com.adobe.example.offloading.JobGeneratorImpl Received request to make job for topic com/adobe/example/offloading and payload /content/geometrixx/de/services

Desenvolvendo um consumidor de trabalho

Para consumir trabalhos, desenvolva um serviço OSGi que implemente a interface org.apache.sling.event.jobs.consumer.JobConsumer. Identifique com o tópico a ser consumido usando a propriedade JobConsumer.PROPERTY_TOPICS.

O exemplo de implementação JobConsumer a seguir é registrado com o tópico com/adobe/example/offloading. O consumidor simplesmente define a propriedade Consumed do nó de conteúdo da carga como true.

package com.adobe.example.offloading;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.event.jobs.Job;
import org.apache.sling.event.jobs.JobManager;
import org.apache.sling.event.jobs.consumer.JobConsumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.jcr.Session;
import javax.jcr.Node;

import com.adobe.granite.offloading.api.OffloadingJobProperties;

@Component
@Service
public class MyJobConsumer implements JobConsumer {

 public static final String TOPIC = "com/adobe/example/offloading";

 @Property(value = TOPIC)
 static final String myTopic = JobConsumer.PROPERTY_TOPICS;

 @Reference
 private ResourceResolverFactory resolverFactory;

 @Reference
 private JobManager jobManager;

 private final Logger log = LoggerFactory.getLogger(getClass());

 public JobResult process(Job job) {
  JobResult result = JobResult.FAILED;
  String topic = job.getTopic();
  log.info("Consuming job of topic: {}", topic);
  String payloadIn =  (String) job.getProperty(OffloadingJobProperties.INPUT_PAYLOAD.propertyName());
  String payloadOut =  (String) job.getProperty(OffloadingJobProperties.OUTPUT_PAYLOAD.propertyName());

  log.info("Job has Input Payload {} and Output Payload {}",payloadIn, payloadOut);

  ResourceResolver resolver = null;
  try {
   resolver = resolverFactory.getAdministrativeResourceResolver(null);
   Session session = resolver.adaptTo(Session.class);
   Node inNode = session.getNode(payloadIn);
   inNode.getNode(Node.JCR_CONTENT).setProperty("consumed",true);
   result = JobResult.OK;
  }catch (Exception e){
   log.info("ERROR -- JOB RESULT IS FAILURE " + e.getMessage());
   result = JobResult.FAILED;
  }
  log.info("Job OK for payload {}",payloadIn);
  return result;
 }
}

A classe MyJobConsumer gera as seguintes mensagens de log para uma carga de entrada de /content/geometrixx/de/services:

10.06.2013 16:02:40.803 *INFO* [pool-7-thread-17-<main queue>(com/adobe/example/offloading)] com.adobe.example.offloading.MyJobConsumer Consuming job of topic: com/adobe/example/offloading
10.06.2013 16:02:40.803 *INFO* [pool-7-thread-17-<main queue>(com/adobe/example/offloading)] com.adobe.example.offloading.MyJobConsumer Job has Input Payload /content/geometrixx/de/services and Output Payload /content/geometrixx/de/services
10.06.2013 16:02:40.884 *INFO* [pool-7-thread-17-<main queue>(com/adobe/example/offloading)] com.adobe.example.offloading.MyJobConsumer Job OK for payload /content/geometrixx/de/services

A propriedade Consumida pode ser observada usando o CRXDE Lite:

chlimage_1-25

Dependências Maven

Adicione as seguintes defesas de dependência ao arquivo pom.xml para que o Maven possa resolver as classes relacionadas à descarga.

<dependency>
   <groupId>org.apache.sling</groupId>
   <artifactId>org.apache.sling.event</artifactId>
   <version>3.1.5-R1485539</version>
   <scope>provided</scope>
</dependency>
<dependency>
   <groupId>com.adobe.granite</groupId>
   <artifactId>com.adobe.granite.offloading.core</artifactId>
   <version>1.0.4</version>
   <scope>provided</scope>
</dependency>

Os exemplos anteriores também exigiam as seguintes definições de dependência:

<dependency>
   <groupId>org.apache.sling</groupId>
   <artifactId>org.apache.sling.api</artifactId>
   <version>2.4.3-R1488084</version>
   <scope>provided</scope>
</dependency>

<dependency>
   <groupId>org.apache.sling</groupId>
   <artifactId>org.apache.sling.jcr.jcr-wrapper</artifactId>
   <version>2.0.0</version>
   <scope>provided</scope>
</dependency>

Nesta página

Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now