如何在 AEM 中将后台作业创建为云?

问题描述

我想创建一个由 AEM 执行的每日后台作业。 看了aem文档和apache sling官网,觉得需要两个类。

  • 将作业注册到 JobManager 的服务类。
  • 完成工作的消费者类。

所以我尝试了这些代码,但我的工作没有执行。

服务类

import org.apache.sling.event.jobs.JobManager;
import org.apache.sling.event.jobs.JobBuilder.ScheduleBuilder;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
public class MyJobService {
    private static final Logger logger = LoggerFactory.getLogger(MyJobService.class);
    
    @Reference
    private JobManager jobManager;

    public static final String JOB_TOPIC = "my/sample/jobtopic";

    public void startScheduledJob() {
        ScheduleBuilder scheduleBuilder = jobManager.createJob(JOB_TOPIC).schedule();
       
        scheduleBuilder.hourly(9,0); // execute daily at AM9:00
        if (scheduleBuilder.add() == null) {
            logger.error("myjobservice error");
        }
    }
}

工作消费类

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 + "=my/sample/jobtopic"
    }
)
public class MyJobConsumer implements JobConsumer {
    private static final Logger logger = LoggerFactory.getLogger(MyJobConsumer.class);
    @Override
    public JobResult process(Job job) {
        String topic = job.getTopic();
        logger.info("this message is from myjobconsumer. topic is " + topic);
        return JobResult.OK;
    }  
}

我需要另一个类或一些配置吗?我的代码有问题吗?

解决方法

如果你用@Activate注解一个方法,它会在组件启动时被调用。

@Activate public void startScheduledJob()

我猜您希望您的工作在启动时运行。 另一种选择是让 MyJobService 成为一个 servlet 并从外部调用它。