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

fi.evolver.basics.spring.triggerable.AsyncTriggerService Maven / Gradle / Ivy

package fi.evolver.basics.spring.triggerable;


import static fi.evolver.utils.timing.TimingUtils.createTimer;
import static fi.evolver.utils.timing.TimingUtils.destroyTimer;

import java.util.Map;
import java.util.Optional;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import fi.evolver.basics.spring.job.ResultState;
import fi.evolver.basics.spring.job.TaskStatusService;
import fi.evolver.basics.spring.job.TaskStatusService.Task;
import fi.evolver.basics.spring.job.entity.TaskStatus;
import fi.evolver.basics.spring.job.entity.TaskStatus.TaskState;
import fi.evolver.utils.ContextUtils;
import fi.evolver.utils.ContextUtils.Context;
import fi.evolver.utils.ContextUtils.ContextCloser;
import fi.evolver.utils.timing.TimingUtils.AutoCloser;


@Component
public class AsyncTriggerService {
	private static final Logger LOG = LoggerFactory.getLogger(AsyncTriggerService.class);


	private final TaskStatusService taskStatusService;


	@Autowired
	public AsyncTriggerService(TaskStatusService taskStatusService) {
		this.taskStatusService = taskStatusService;
	}


	@Async
	public void runAsync(Triggerable triggerable, String triggerName, Map arguments, TaskStatus taskStatus, Context context, Optional callBack) {
		try (ContextCloser cc = ContextUtils.ensureContext(context);
				Task task = taskStatusService.couple(taskStatus);
				AutoCloser t = createTimer()) {

			try {
				ResultState state = triggerable.trigger(arguments);
				task.setResultState(state);
				LOG.info("{} - {}", triggerName, state.getMessage());
			}
			catch (RuntimeException e) {
				task.setResultState(new ResultState(TaskState.FAILED, "Failed: %s", e.getMessage()));
				LOG.error("Triggering {} failed", triggerName, e);
			}
			finally {
				LOG.debug("{} - Time breakdown:\n{}", triggerName, destroyTimer());
				callBack.ifPresent(c -> c.done(task.getResultState()));
			}
		}
	}


	public interface AsyncTriggerCallback {

		public void done(ResultState resultState);

	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy