——————————目录大纲——————————
————————————————————————
一、背景
在AEM中实现定时执行的任务。
Sling Scheduler 更适合单纯的定时任务调度,而 AEM Workflow Scheduler 更适合与工作流相关的任务调度。
二、正文
1、使用 Sling Scheduler 创建定时任务
1.1 创建Job Consumer类
创建一个实现Job Consumer接口的Java类,用于处理调度任务。这里相当于是执行的部分,需要由其他地方去调起,才能执行当前的逻辑。
Expand source
package com.example.core.jobs;
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(
immediate = true,
service = JobConsumer.class,
property = { JobConsumer.PROPERTY_TOPICS + "=lenovo/createtagsppc/job"}
)
public class MyJobConsumer implements JobConsumer {
private static final Logger log = LoggerFactory.getLogger(MyJobConsumer.class);
@Reference
private MyService myService;
@Override
public JobResult process(Job job) {
log.info("Job is being processed");
// 获取添加任务时的属性
String attr = (String) job.getProperty("attr");
// Add your job logic here
myService.todo(attr);
return JobResult.OK;
}
}
1.2 创建Job Producer类
创建一个实现Runnable接口的JobProducer Java 类,并使用Sling的@Designate和OSGi的@Component注解进行配置,此处的功能为调用发起任务的入口,即调用方。
Expand source
package com.example.core.schedulers;
import org.apache.sling.commons.scheduler.ScheduleOptions;
import org.apache.sling.commons.scheduler.Scheduler;
import org.apache.sling.event.jobs.JobManager;
import org.apache.sling.event.jobs.Job;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Modified;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.metatype.annotations.Designate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component(immediate = true, service = Runnable.class)
// @Designate(ocd = MyScheduler.Config.class) 使用该形式需要xml配置,使用下面的则需要创建对应的配置类
@Designate(ocd = PpcSchedulerConfiguration.class)
public class MyScheduler implements Runnable {
private static final Logger log = LoggerFactory.getLogger(MyScheduler.class);
@Reference
private Scheduler scheduler;
@Reference
private MyLogicService myLogicService;
@Activate
protected void activate(PpcSchedulerConfiguration config) {
addScheduler(config);
}
@Modified
protected void activate(Config config) {
removeScheduler();
schedulerId = config.schedulerName().hashCode();
addScheduler(config);
}
@Deactivate
protected void deactivate(PpcSchedulerConfiguration config) {
removeScheduler();
}
private void removeScheduler() {
scheduler.unschedule(String.valueOf(schedulerId));
}
/**
* This method adds the scheduler
*
* @param config
*/
private void addScheduler(PpcSchedulerConfiguration config) {
if(config.enabled()) {
ScheduleOptions scheduleOptions = scheduler.EXPR(config.cronExpression());
scheduleOptions.name(config.schedulerName());
scheduleOptions.canRunConcurrently(false);
scheduler.schedule(this, scheduleOptions);
LOGGER.info("Experience AEM Scheduler added");
} else {
LOGGER.info("Experience AEM Scheduler disabled");
}
}
public void run() {
LOGGER.info("Category sync job started.");
try{
Map<String, Object> jobProperties = new HashMap<>();
jobProperties.put("attr", "test");
jobManager.addJob("lenovo/createtagsppc/job", jobProperties);
}catch (UnsupportedOperationException e) {
LOGGER.error("Exception occurred in syncCategoryInformation of LifeRayServiceImpl",e);
}
LOGGER.info("Category sync job finished.");
}
}
1.3 创建执行配置
这里可以配置执行的参数,比如执行时间什么的;
Expand source
package com.lenovo.platform.core.services.configs;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.AttributeType;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
@ObjectClassDefinition(
name = "PPC Scheduler Configuration",
description = "PPC Scheduler Configuration"
)
public @interface PpcSchedulerConfiguration {
@AttributeDefinition(
name = "Scheduler name",
description = "Name of the scheduler",
type = AttributeType.STRING)
public String schedulerName() default "PPC Custom Scheduler Configuration";
@AttributeDefinition(
name = "Enabled",
description = "True, if scheduler service is enabled",
type = AttributeType.BOOLEAN)
public boolean enabled() default true;
@AttributeDefinition(
name = "Cron Expression",
description = "Cron expression used by the scheduler",
type = AttributeType.STRING)
public String cronExpression() default "0 0 0,4,8,12,16,20 ? * *"; // every 4 hours starting at 00:00.
}1.4 配置 OSGi 元数据(可选)
如果使用@ObjectClassDefinition的形式,则不需要进行此步骤。
在 META-INF 文件夹下创建 OSGi 配置文件。
OSGI-INF/metatype/com.example.core.schedulers.MyScheduler.xml
Expand source
<?xml version="1.0" encoding="UTF-8"?>
<metatype:MetaData
xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.1.0"
localization="OSGI-INF/l10n/metatype">
<OCD id="com.example.core.schedulers.MyScheduler" name="My Scheduler" description="Scheduler for running tasks">
<AD id="cronExpression" type="String" default="0 0 * * * ?" name="Cron Expression" description="Cron expression for scheduling the task"/>
</OCD>
</metatype:MetaData>
2、使用 AEM Workflow Scheduler 创建定时任务
AEM Workflow Scheduler 可以用来在工作流中调度定时任务。
2.1 创建工作流模型
在 AEM 管理控制台中创建一个新的工作流模型。
- 登录到 AEM。
- 进入 Tools > Workflow > Models。
- 创建一个新的工作流模型,并添加您的工作流步骤。
2.2 配置 Workflow Launcher
使用 Workflow Launcher 来配置定时触发工作流。
- 进入 Tools > Workflow > Launchers。
- 创建一个新的 Launcher,配置定时任务的触发条件和工作流模型。