
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