All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.taskurotta.service.schedule.EnqueueTaskJob Maven / Gradle / Ivy

package ru.taskurotta.service.schedule;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.taskurotta.server.TaskServer;
import ru.taskurotta.service.console.retriever.QueueInfoRetriever;
import ru.taskurotta.service.schedule.model.JobVO;
import ru.taskurotta.transport.model.TaskContainer;
import ru.taskurotta.transport.utils.TransportUtils;

import java.util.UUID;

/**
 * User: dimadin
 * Date: 24.09.13 12:40
 */
public class EnqueueTaskJob implements Job {

    private static final Logger logger = LoggerFactory.getLogger(EnqueueTaskJob.class);

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobDataMap jdm = context.getJobDetail().getJobDataMap();
        JobVO job = (JobVO) jdm.get(JobConstants.DATA_KEY_JOB);
        JobManager jobManager = (JobManager) jdm.get(JobConstants.DATA_KEY_JOB_MANAGER);
        TaskContainer taskContainer = job != null ? job.getTask() : null;
        TaskServer taskServer = (TaskServer) jdm.get(JobConstants.DATA_KEY_TASK_SERVER);
        QueueInfoRetriever queueInfoRetriever = (QueueInfoRetriever) jdm.get(JobConstants.DATA_KEY_QUEUE_INFO_RETRIEVER);

        try {

            validateEntities(taskServer, job, queueInfoRetriever, jobManager);

            if (job.getQueueLimit() > 0) {
                String queueName = TransportUtils.createQueueName(taskContainer.getActorId(), TransportUtils.getTaskList(taskContainer));
                int size = queueInfoRetriever.getQueueTaskCount(queueName);
                if (size >= job.getQueueLimit()) {
                    logger.debug("Queue [{}] contains [{}] elements. Skip task due to limit[{}].", taskContainer.getActorId(), size, job.getQueueLimit());
                    return;
                }
            }

            taskContainer = renewTaskGuids(taskContainer);
            logger.debug("Starting process for task [{}] on schedule", taskContainer);

            taskServer.startProcess(taskContainer);

            if (job.getErrorCount() > 0) {
                job.setErrorCount(0);
                job.setLastError("");
                jobManager.updateErrorCount(job.getId(), job.getErrorCount(), job.getLastError());//reset error counter
            }

        } catch (Throwable e) {
            logger.error("Cannot execute scheduled job for task [" + taskContainer + "]", e);

            if (jobManager != null && job != null && job.getId() > 0) {
                job.setErrorCount(job.getErrorCount() + 1);
                job.setLastError(e.getClass().getName() + ": " + e.getMessage());
                try {
                    jobManager.updateErrorCount(job.getId(), job.getErrorCount(), job.getLastError());
                    int maxErrCount = job.getMaxErrors();
                    if (maxErrCount>0 && job.getErrorCount() + 1 >= maxErrCount) {
                        if (jobManager.stopJob(job.getId())) {
                            jobManager.updateJobStatus(job.getId(), JobConstants.STATUS_ERROR);
                        }
                    }

                } catch (Throwable err) {
                    logger.error("Error at error handling for job [" + job + "]", e);
                }

            }
        }
    }


    public void validateEntities(TaskServer taskServer, JobVO job, QueueInfoRetriever queueInfoRetriever, JobManager jobManager) {
        if (taskServer == null) {
            throw new IllegalArgumentException("Scheduled job have no TaskServer data entity!");
        }
        if (job == null) {
            throw new IllegalArgumentException("Scheduled job have no JobVO data entity!");
        }
        if (jobManager == null) {
            throw new IllegalArgumentException("Scheduled job have no JobManager data entity!");
        }
        if (job.getTask() == null) {
            throw new IllegalArgumentException("Scheduled job have no TaskContainer data entity!");
        }
        if (job.getQueueLimit() > 0 && queueInfoRetriever == null) {
            throw new IllegalArgumentException("Scheduled job have no QueueInfoRetriever data entity!");
        }
    }

    public static TaskContainer renewTaskGuids(TaskContainer target) {
        UUID newGuid = UUID.randomUUID();
        return new TaskContainer(newGuid, newGuid, null, target.getMethod(), target.getActorId(), target.getType(),
                target.getStartTime(), target.getErrorAttempts(), target.getArgs(), target.getOptions(),
                target.isUnsafe(), target.getFailTypes());
    }


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy