如何在AEM as a Cloud Service中的領導者執行個體上執行工作
瞭解如何在AEM Author服務中的領導執行個體上執行作為AEM as a Cloud Service一部分的工作,並瞭解如何將其設定為只執行一次。
Sling作業是指在背景執行的非同步工作,旨在處理系統或使用者觸發的事件。 依照預設,這些工作會平均分配到叢集中的所有執行處理(pod)。
如需詳細資訊,請參閱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);
}
}
上述程式碼要注意的重點為:
- 工作承載有兩個屬性:
action和message。 - 使用JobManager的
addJob(...)方法,工作已新增至主題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 Author服務(以具有多個AEM Author JVM的叢集方式運作)上執行時,工作將在每個AEM Author例項(pod)上執行一次,這表示建立的作業數量將符合pod數量。 Pod的數量一律會超過一個(適用於非RDE環境),但會隨著AEM as a Cloud Service的內部資源管理而波動。
工作會在每個AEM Author執行個體(pod)上執行,因為wknd/simple/job/topic與AEM的主佇列相關聯,該佇列會將工作分散到所有可用的執行個體。
如果工作負責變更狀態(例如建立或更新資源或外部服務),這通常會有問題。
如果您希望工作在AEM Author服務上只執行一次,請新增如下所述的工作佇列設定。
您可以在Cloud Manager中檢閱AEM Author服務的記錄檔,以驗證它。
您應會看到:
<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 Author執行個體(68775db964-nxxcx和68775db964-r4zk7)各一個,代表每個執行個體(pod)已處理工作。
如何在領導者執行個體上執行工作
若要在AEM Author服務上執行工作一次,請建立型別為 Ordered 的新Sling工作佇列,並將您的工作主題(wknd/simple/job/topic)與此佇列建立關聯。 使用此設定時,將只允許前置AEM Author例項(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 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