如何在 AEM as a Cloud 中创建后台作业?
How to create a background job in AEM as a Cloud?
我想创建一个每天由 AEM 执行的后台作业。
我阅读了 aem 文档和 apache sling 官方网站,我想我需要两个 classes.
- 将作业注册到 JobManager 的服务class。
- 一个消费者 class 完成这项工作。
所以我尝试了这些代码,但我的工作没有执行。
服务class
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");
}
}
}
工作消费者class
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;
}
}
我需要另一个 class 或一些配置吗?我的代码有问题吗?
如果您使用@Activate 注释一个方法,它将在组件启动时被调用。
@激活
public void startScheduledJob()
我猜你希望你的工作在启动时 运行。
另一种选择是让 MyJobService 成为一个 servlet 并从外部调用它。
我想创建一个每天由 AEM 执行的后台作业。 我阅读了 aem 文档和 apache sling 官方网站,我想我需要两个 classes.
- 将作业注册到 JobManager 的服务class。
- 一个消费者 class 完成这项工作。
所以我尝试了这些代码,但我的工作没有执行。
服务class
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");
}
}
}
工作消费者class
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;
}
}
我需要另一个 class 或一些配置吗?我的代码有问题吗?
如果您使用@Activate 注释一个方法,它将在组件启动时被调用。
@激活 public void startScheduledJob()
我猜你希望你的工作在启动时 运行。 另一种选择是让 MyJobService 成为一个 servlet 并从外部调用它。