Developer Jahia 8 Jahia 8.1 Jahia 8.2

What is the lifecyle of a job?

Question

What is the life cycle of a job? What happens if we remove its definition from a module?  

Answer

In Jahia 8, a background job is declared through OSGI. Here is an example, taken from this Github repository:

package org.foo.modules.jobs;

import org.jahia.services.scheduler.BackgroundJob;
import org.jahia.services.scheduler.SchedulerService;
import org.jahia.settings.SettingsBean;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Simple Background Job declared with OSGi
 *
 */
@Component(immediate = true)
public class TestBackgroundJob extends BackgroundJob {
    private static Logger logger = LoggerFactory.getLogger(TestBackgroundJob.class);

    private SchedulerService schedulerService;
    private JobDetail jobDetail;

    @Activate
    public void start() throws Exception {
        jobDetail = BackgroundJob.createJahiaJob("Simple background job made declared with OSGi", TestBackgroundJob.class);
        if (schedulerService.getAllJobs(jobDetail.getGroup()).isEmpty() && SettingsBean.getInstance().isProcessingServer()) {
            Trigger trigger = new SimpleTrigger("testBackgroundJob_trigger", jobDetail.getGroup(), SimpleTrigger.REPEAT_INDEFINITELY, 3000);
            schedulerService.getScheduler().scheduleJob(jobDetail, trigger);
        }
    }

    @Deactivate
    public void stop() throws Exception {
        if (!schedulerService.getAllJobs(jobDetail.getGroup()).isEmpty() && SettingsBean.getInstance().isProcessingServer()) {
            schedulerService.getScheduler().deleteJob(jobDetail.getName(), jobDetail.getGroup());
        }
    }

    @Override
    public void executeJahiaJob(JobExecutionContext jobExecutionContext) {
        logger.info("Hello Jahia!");
    }

    @Reference
    public void setSchedulerService(SchedulerService schedulerService) {
        this.schedulerService = schedulerService;
    }
}

When the module is started, the method start will be triggered, adding the job to the scheduler.

When the module is stopped, the method stop will be triggered, removing the job from the scheduler. 

Consequently, if you deploy a new version of your module which doesn't contain this job, it will be removed from the scheduler.