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

io.datarouter.tasktracker.service.LongRunningTaskVacuumService Maven / Gradle / Ivy

The newest version!
/*
 * Copyright © 2009 HotPads ([email protected])
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.datarouter.tasktracker.service;

import java.time.Instant;
import java.util.ArrayList;
import java.util.List;

import io.datarouter.instrumentation.task.TaskTracker;
import io.datarouter.model.databean.Databean;
import io.datarouter.scanner.Scanner;
import io.datarouter.tasktracker.config.DatarouterTaskTrackerSettingRoot;
import io.datarouter.tasktracker.storage.LongRunningTask;
import io.datarouter.tasktracker.storage.LongRunningTaskDao;
import io.datarouter.util.collection.ListTool;
import io.datarouter.util.lang.ObjectTool;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;

@Singleton
public class LongRunningTaskVacuumService{

	@Inject
	private LongRunningTaskDao dao;
	@Inject
	private DatarouterTaskTrackerSettingRoot settings;

	public void run(TaskTracker tracker){
		List relatedTasks = new ArrayList<>();
		dao.scan()
				.each($ -> tracker.increment())
				.advanceUntil($ -> tracker.shouldStop())
				.forEach(task -> {
					String name = task.getKey().getName();
					if(!relatedTasks.isEmpty()){
						String previousName = ListTool.getLastOrNull(relatedTasks).getKey().getName();
						if(ObjectTool.notEquals(previousName, name)){
							vacuumRelatedTasks(new ArrayList<>(relatedTasks));
							relatedTasks.clear();
						}
					}
					relatedTasks.add(task);
					tracker.setLastItemProcessed(name);
				});
		vacuumRelatedTasks(new ArrayList<>(relatedTasks));
	}

	private void vacuumRelatedTasks(List tasks){
		// remove really old entries
		Instant tooOldCutoff = Instant.now().minus(settings.maxAge.get().toJavaDuration());
		List tooOld = tasks.stream()
				.filter(task -> task.getKey().getTriggerTime().toInstant().isBefore(tooOldCutoff))
				.toList();
		Scanner.of(tooOld)
				.map(Databean::getKey)
				.then(dao::deleteBatched);

		// keep the latest N
		List remaining = new ArrayList<>(tasks);
		remaining.removeAll(tooOld);
		if(remaining.size() <= settings.countToKeep.get()){
			return;
		}
		Scanner.of(remaining)
				.limit(remaining.size() - settings.countToKeep.get())
				.map(Databean::getKey)
				.then(dao::deleteBatched);
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy