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

com.spikeify.taskqueue.service.QueuePurger Maven / Gradle / Ivy

package com.spikeify.taskqueue.service;

import com.spikeify.taskqueue.entities.QueueSettings;
import com.spikeify.taskqueue.entities.QueueTask;
import com.spikeify.taskqueue.entities.TaskState;
import com.spikeify.taskqueue.entities.TaskStatistics;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

public class QueuePurger implements Runnable {

	private static final Logger log = Logger.getLogger(QueuePurger.class.getSimpleName());
	private static final int ADDITIONAL_SLACK = 10; // add 10 seconds ... so purge and time-out in Scheduler can't clash

	private final TaskQueueService queues;
	private final int timeout;
	private String queueName;

	private Map states = new HashMap<>();

	public QueuePurger(TaskQueueService queueService, String queue, QueueSettings settings) {

		queues = queueService;

		queueName = queue;

		states.put(TaskState.finished, settings.getPurgeSuccessfulAfterMinutes());
		states.put(TaskState.failed, settings.getPurgeFailedAfterMinutes());

		timeout = settings.getTaskTimeoutSeconds();
	}

	@Override
	public void run() {

		for (TaskState state: states.keySet()) {

			int maxAge = states.get(state);
			TaskStatistics purge = queues.purge(state, maxAge, queueName);

			if (purge != null) {

				log.info("[" + queueName + "] purge: " + purge.getCount() + " " + state + " task(s).");
			}
		}

		// check for timed out tasks ...
		List running = queues.list(TaskState.running, queueName);
		for (QueueTask task : running) {
			if (task.isOlderThanSeconds(timeout + ADDITIONAL_SLACK)) {
				log.info("Found hanged/timed out task: " + task + ", putting into failed state!");
				queues.transition(task, TaskState.failed); // move task to failed state ... so it can be restarted
			}
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy