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

Posted

技术标签:

【中文标题】如何在 AEM 作为云中创建后台作业?【英文标题】:How to create a background job in AEM as a Cloud? 【发布时间】:2021-06-10 04:12:12 【问题描述】:

我想创建一个由 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;
      

我需要其他课程或一些配置吗?我的代码有问题吗?

【问题讨论】:

你是否在某个地方调用了 startScheduledJob 方法? @ChristianSchneider 感谢您的评论。我误解了它是一种自动的东西。你能告诉我在正常 AEM 使用中在哪里调用这种类型的方法吗? 只能在其他代码中调用,但可以在组件启动时调用。 @watopin 你有没有设法让这个工作,它似乎在预定的时间调用它两次 【参考方案1】:

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

@激活 public void startScheduledJob()

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

【讨论】:

非常感谢。我的工作被执行。但我的工作每次执行两次(或更多)。是队列问题吗? 您的组件可能不止一次被激活(在 AEM 中很容易发生)。你真的想如何激活你的工作?它应该在启动时运行还是在不同的触发器上运行? 不管调用多少次startScheduledJob()方法(因为这个方法只是调度),我希望我的工作每天只完成一次(jobconsumer的流程方法)。 也许你可以使用sling.apache.org/documentation/bundles/… 谢谢。我尝试了公共调度程序,但它在 AEM 作为云环境中不起作用。在本地 SDK 上没问题。

以上是关于如何在 AEM 作为云中创建后台作业?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 JobRunr 在 Spring 控制器/服务中检测我计划的后台作业?

在与排队的用户不同的进程中运行后台作业

如何使用 Sidekiq 运行连续的后台作业?

Linux作业管理

如何确保 Sidekiq 后台作业针对它们启动的同一数据库运行

如何检查后台作业是不是存在? (重击)