AEM as a Cloud Service의 리더 인스턴스에서 작업을 실행하는 방법

AEM as a Cloud Service의 일부로 AEM Author 서비스의 리더 인스턴스에서 작업을 실행하는 방법을 알아보고 한 번만 실행되도록 구성하는 방법을 이해합니다.

슬링 작업은 시스템 또는 사용자가 트리거한 이벤트를 처리하도록 설계된 백그라운드에서 작동하는 비동기 작업입니다. 기본적으로 이러한 작업은 클러스터의 모든 인스턴스(포드)에 균등하게 분배됩니다.

자세한 내용은 Apache Sling 이벤트 및 작업 처리를 참조하십시오.

작업 만들기 및 처리

데모용으로 작업 프로세서에 메시지를 기록하도록 지시하는 간단한 작업을 만들어 보겠습니다.

작업 만들기

아래 코드를 사용하여 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);
    }
}

위 코드에서 유의할 사항은 다음과 같습니다.

  • 작업 페이로드에는 actionmessage 속성이 두 개 있습니다.
  • JobManageraddJob(...) 메서드를 사용하여 작업이 wknd/simple/job/topic 주제에 추가됩니다.

작업 처리

아래 코드를 사용하여 위의 Apache Sling 작업을 처리 ​합니다.

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;
    }

}

위 코드에서 유의할 사항은 다음과 같습니다.

  • SimpleJobConsumerImpl 클래스는 JobConsumer 인터페이스를 구현합니다.
  • wknd/simple/job/topic 항목에서 작업을 사용하도록 등록된 서비스입니다.
  • process(...) 메서드는 작업 페이로드의 message 속성을 로깅하여 작업을 처리합니다.

기본 작업 처리

위의 코드를 AEM as a Cloud Service 환경에 배포하고 여러 AEM 작성자 JVM이 있는 클러스터로 작동하는 AEM 작성자 서비스에서 실행하면 각 AEM 작성자 인스턴스(pod)에서 작업이 한 번 실행됩니다. 즉, 생성된 작업 수는 pod 수와 일치합니다. RDE가 아닌 환경의 경우 Pod의 수는 항상 두 개 이상이지만 AEM as a Cloud Service의 내부 리소스 관리에 따라 달라집니다.

wknd/simple/job/topic이(가) 사용 가능한 모든 인스턴스에 작업을 배포하는 AEM의 기본 큐와 연결되어 있으므로 작업은 각 AEM 작성자 인스턴스(pod)에서 실행됩니다.

이 문제는 작업에서 리소스 또는 외부 서비스 만들기 또는 업데이트와 같은 상태 변경을 담당하는 경우 자주 발생합니다.

AEM 작성자 서비스에서 작업을 한 번만 실행하려면 아래에 설명된 작업 큐 구성을 추가하십시오.

Cloud Manager에서 AEM 작성자 서비스의 로그를 검토하여 확인할 수 있습니다.

모든 인스턴스에서 작업 처리

다음이 표시됩니다.

<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

각 AEM 작성자 인스턴스(68775db964-nxxcx68775db964-r4zk7)에 대해 하나씩, 각 인스턴스(pod)에서 작업을 처리했음을 나타내는 두 개의 로그 항목이 있습니다.

리더 인스턴스에서 작업을 실행하는 방법

AEM 작성자 서비스에서 한 번만 작업을 실행하려면 주문 유형의 새 Sling 작업 큐를 만들고 작업 주제(wknd/simple/job/topic)를 이 큐와 연결하십시오. 이 구성을 사용하면 리더 AEM 작성자 인스턴스(pod)에서만 작업을 처리할 수 있습니다.

AEM 프로젝트의 ui.config 모듈에서 OSGi 구성 파일(org.apache.sling.event.jobs.QueueConfiguration~wknd.cfg.json)을 만들고 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
  }

위 구성에서 중요 사항은 다음과 같습니다.

  • 대기열 주제가 wknd/simple/job/topic(으)로 설정되어 있습니다.
  • 큐 유형이 ORDERED(으)로 설정되어 있습니다.
  • 최대 병렬 작업 수가 1(으)로 설정되어 있습니다.

위의 구성을 배포하면 작업이 리더 인스턴스에서만 처리되어 전체 AEM 작성자 서비스에서 한 번만 실행됩니다.

<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
recommendation-more-help
4859a77c-7971-4ac9-8f5c-4260823c6f69