8、定时任务

发布于:2026-07-08 Adobe AEM 0条评论

——————————目录大纲——————————

————————————————————————

一、背景

在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 管理控制台中创建一个新的工作流模型。

  1. 登录到 AEM。
  2. 进入 Tools > Workflow > Models。
  3. 创建一个新的工作流模型,并添加您的工作流步骤。

2.2 配置 Workflow Launcher

使用 Workflow Launcher 来配置定时触发工作流。

  1. 进入 Tools > Workflow > Launchers。
  2. 创建一个新的 Launcher,配置定时任务的触发条件和工作流模型。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理