TSK-1403: Add a log message to each SPI operation in case of a thrown Exception

This commit is contained in:
Joerg Heffner 2020-10-19 14:26:31 +02:00 committed by gitgoodjhe
parent a0c092b3b9
commit d7e1b5cea9
7 changed files with 86 additions and 22 deletions

View File

@ -122,7 +122,6 @@ public interface TaskanaEngine {
*/ */
CurrentUserContext getCurrentUserContext(); CurrentUserContext getCurrentUserContext();
/** /**
* Connection management mode. Controls the connection handling of taskana * Connection management mode. Controls the connection handling of taskana
* *

View File

@ -5,8 +5,8 @@ import org.apache.ibatis.session.SqlSession;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.spi.history.internal.HistoryEventManager; import pro.taskana.spi.history.internal.HistoryEventManager;
import pro.taskana.spi.routing.internal.TaskRoutingManager;
import pro.taskana.spi.task.internal.CreateTaskPreprocessorManager; import pro.taskana.spi.task.internal.CreateTaskPreprocessorManager;
import pro.taskana.task.internal.TaskRoutingManager;
/** /**
* FOR INTERNAL USE ONLY. * FOR INTERNAL USE ONLY.

View File

@ -51,6 +51,7 @@ import pro.taskana.monitor.api.MonitorService;
import pro.taskana.monitor.internal.MonitorMapper; import pro.taskana.monitor.internal.MonitorMapper;
import pro.taskana.monitor.internal.MonitorServiceImpl; import pro.taskana.monitor.internal.MonitorServiceImpl;
import pro.taskana.spi.history.internal.HistoryEventManager; import pro.taskana.spi.history.internal.HistoryEventManager;
import pro.taskana.spi.routing.internal.TaskRoutingManager;
import pro.taskana.spi.task.internal.CreateTaskPreprocessorManager; import pro.taskana.spi.task.internal.CreateTaskPreprocessorManager;
import pro.taskana.task.api.TaskService; import pro.taskana.task.api.TaskService;
import pro.taskana.task.internal.AttachmentMapper; import pro.taskana.task.internal.AttachmentMapper;
@ -58,7 +59,6 @@ import pro.taskana.task.internal.ObjectReferenceMapper;
import pro.taskana.task.internal.TaskCommentMapper; import pro.taskana.task.internal.TaskCommentMapper;
import pro.taskana.task.internal.TaskMapper; import pro.taskana.task.internal.TaskMapper;
import pro.taskana.task.internal.TaskQueryMapper; import pro.taskana.task.internal.TaskQueryMapper;
import pro.taskana.task.internal.TaskRoutingManager;
import pro.taskana.task.internal.TaskServiceImpl; import pro.taskana.task.internal.TaskServiceImpl;
import pro.taskana.workbasket.api.WorkbasketService; import pro.taskana.workbasket.api.WorkbasketService;
import pro.taskana.workbasket.internal.DistributionTargetMapper; import pro.taskana.workbasket.internal.DistributionTargetMapper;

View File

@ -7,8 +7,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.SystemException;
import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.spi.history.api.TaskanaHistory; import pro.taskana.spi.history.api.TaskanaHistory;
import pro.taskana.spi.history.api.events.classification.ClassificationHistoryEvent; import pro.taskana.spi.history.api.events.classification.ClassificationHistoryEvent;
import pro.taskana.spi.history.api.events.task.TaskHistoryEvent; import pro.taskana.spi.history.api.events.task.TaskHistoryEvent;
@ -18,10 +17,9 @@ import pro.taskana.spi.history.api.events.workbasket.WorkbasketHistoryEvent;
public final class HistoryEventManager { public final class HistoryEventManager {
private static final Logger LOGGER = LoggerFactory.getLogger(HistoryEventManager.class); private static final Logger LOGGER = LoggerFactory.getLogger(HistoryEventManager.class);
private static final String SENDING_EVENT = "Sending event to history service providers: {}";
private static HistoryEventManager singleton; private static HistoryEventManager singleton;
private final ServiceLoader<TaskanaHistory> serviceLoader;
private boolean enabled = false; private boolean enabled = false;
private ServiceLoader<TaskanaHistory> serviceLoader;
private HistoryEventManager(TaskanaEngine taskanaEngine) { private HistoryEventManager(TaskanaEngine taskanaEngine) {
serviceLoader = ServiceLoader.load(TaskanaHistory.class); serviceLoader = ServiceLoader.load(TaskanaHistory.class);
@ -47,18 +45,55 @@ public final class HistoryEventManager {
} }
public void createEvent(TaskHistoryEvent event) { public void createEvent(TaskHistoryEvent event) {
LOGGER.debug(SENDING_EVENT, event); LOGGER.debug("Sending event to history service providers: {}", event);
serviceLoader.forEach(historyProvider -> historyProvider.create(event)); serviceLoader.forEach(
historyProvider -> {
try {
historyProvider.create(event);
} catch (Exception e) {
LOGGER.error(
String.format(
"Caught an exception while trying to create TaskHistoryEvent in class %s",
historyProvider.getClass().getName()),
e);
throw new SystemException(e.getMessage(), e.getCause());
}
});
} }
public void createEvent(WorkbasketHistoryEvent event) { public void createEvent(WorkbasketHistoryEvent event) {
LOGGER.debug(SENDING_EVENT, event); LOGGER.debug("Sending event to history service providers: {}", event);
serviceLoader.forEach(historyProvider -> historyProvider.create(event)); serviceLoader.forEach(
historyProvider -> {
try {
historyProvider.create(event);
} catch (Exception e) {
LOGGER.error(
String.format(
"Caught an exception while trying to create WorkbasketHistoryEvent in class %s",
historyProvider.getClass().getName()),
e);
throw new SystemException(e.getMessage(), e.getCause());
}
});
} }
public void createEvent(ClassificationHistoryEvent event) { public void createEvent(ClassificationHistoryEvent event) {
LOGGER.debug(SENDING_EVENT, event); LOGGER.debug("Sending event to history service providers: {}", event);
serviceLoader.forEach(historyProvider -> historyProvider.create(event)); serviceLoader.forEach(
historyProvider -> {
try {
historyProvider.create(event);
} catch (Exception e) {
LOGGER.error(
String.format(
"Caught an exception while trying to create "
+ "ClassificationHistoryEvent in class %s",
historyProvider.getClass().getName()),
e);
throw new SystemException(e.getMessage(), e.getCause());
}
});
} }
public void deleteEvents(List<String> taskIds) { public void deleteEvents(List<String> taskIds) {
@ -67,8 +102,13 @@ public final class HistoryEventManager {
historyProvider -> { historyProvider -> {
try { try {
historyProvider.deleteHistoryEventsByTaskIds(taskIds); historyProvider.deleteHistoryEventsByTaskIds(taskIds);
} catch (InvalidArgumentException | NotAuthorizedException e) { } catch (Exception e) {
LOGGER.warn("Caught an exception while trying to delete HistoryEvents", e); LOGGER.error(
String.format(
"Caught an exception while trying to delete HistoryEvents in class %s",
historyProvider.getClass().getName()),
e);
throw new SystemException(e.getMessage(), e.getCause());
} }
}); });
} }

View File

@ -1,4 +1,4 @@
package pro.taskana.task.internal; package pro.taskana.spi.routing.internal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -10,6 +10,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.exceptions.SystemException;
import pro.taskana.common.internal.util.LogSanitizer; import pro.taskana.common.internal.util.LogSanitizer;
import pro.taskana.spi.routing.api.TaskRoutingProvider; import pro.taskana.spi.routing.api.TaskRoutingProvider;
import pro.taskana.task.api.models.Task; import pro.taskana.task.api.models.Task;
@ -23,8 +24,8 @@ public final class TaskRoutingManager {
private static final Logger LOGGER = LoggerFactory.getLogger(TaskRoutingManager.class); private static final Logger LOGGER = LoggerFactory.getLogger(TaskRoutingManager.class);
private static TaskRoutingManager singleton; private static TaskRoutingManager singleton;
private boolean enabled = false; private boolean enabled = false;
private List<TaskRoutingProvider> theTaskRoutingProviders = new ArrayList<>(); private final List<TaskRoutingProvider> theTaskRoutingProviders = new ArrayList<>();
private ServiceLoader<TaskRoutingProvider> serviceLoader; private final ServiceLoader<TaskRoutingProvider> serviceLoader;
private TaskRoutingManager(TaskanaEngine taskanaEngine) { private TaskRoutingManager(TaskanaEngine taskanaEngine) {
serviceLoader = ServiceLoader.load(TaskRoutingProvider.class); serviceLoader = ServiceLoader.load(TaskRoutingProvider.class);
@ -72,7 +73,19 @@ public final class TaskRoutingManager {
// collect in a set to see whether different workbasket ids are returned // collect in a set to see whether different workbasket ids are returned
Set<String> workbasketIds = Set<String> workbasketIds =
theTaskRoutingProviders.stream() theTaskRoutingProviders.stream()
.map(rtr -> rtr.determineWorkbasketId(task)) .map(
rtr -> {
try {
return rtr.determineWorkbasketId(task);
} catch (Exception e) {
LOGGER.error(
String.format(
"Caught Exception while trying to determine workbasket in class %s",
rtr.getClass().getName()),
e);
throw new SystemException(e.getMessage(), e.getCause());
}
})
.filter(Objects::nonNull) .filter(Objects::nonNull)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
if (workbasketIds.isEmpty()) { if (workbasketIds.isEmpty()) {

View File

@ -5,6 +5,7 @@ import java.util.ServiceLoader;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import pro.taskana.common.api.exceptions.SystemException;
import pro.taskana.spi.task.api.CreateTaskPreprocessor; import pro.taskana.spi.task.api.CreateTaskPreprocessor;
import pro.taskana.task.api.models.Task; import pro.taskana.task.api.models.Task;
@ -13,7 +14,7 @@ public class CreateTaskPreprocessorManager {
private static final Logger LOGGER = LoggerFactory.getLogger(CreateTaskPreprocessorManager.class); private static final Logger LOGGER = LoggerFactory.getLogger(CreateTaskPreprocessorManager.class);
private static CreateTaskPreprocessorManager singleton; private static CreateTaskPreprocessorManager singleton;
private boolean enabled = false; private boolean enabled = false;
private ServiceLoader<CreateTaskPreprocessor> serviceLoader; private final ServiceLoader<CreateTaskPreprocessor> serviceLoader;
private CreateTaskPreprocessorManager() { private CreateTaskPreprocessorManager() {
serviceLoader = ServiceLoader.load(CreateTaskPreprocessor.class); serviceLoader = ServiceLoader.load(CreateTaskPreprocessor.class);
@ -41,8 +42,18 @@ public class CreateTaskPreprocessorManager {
public Task processTaskBeforeCreation(Task taskToProcess) { public Task processTaskBeforeCreation(Task taskToProcess) {
LOGGER.debug("Sending task to CreateTaskPreprocessor providers: {}", taskToProcess); LOGGER.debug("Sending task to CreateTaskPreprocessor providers: {}", taskToProcess);
serviceLoader.forEach( serviceLoader.forEach(
createTaskPreprocessorProvider -> createTaskPreprocessorProvider -> {
createTaskPreprocessorProvider.processTaskBeforeCreation(taskToProcess)); try {
createTaskPreprocessorProvider.processTaskBeforeCreation(taskToProcess);
} catch (Exception e) {
LOGGER.error(
String.format(
"Caught exception while processing task before creation in class %s",
createTaskPreprocessorProvider.getClass().getName()),
e);
throw new SystemException(e.getMessage(), e.getCause());
}
});
return taskToProcess; return taskToProcess;
} }
} }

View File

@ -47,6 +47,7 @@ class ArchitectureTest {
"pro.taskana.workbasket.api", "pro.taskana.workbasket.api",
"pro.taskana.workbasket.internal", "pro.taskana.workbasket.internal",
"pro.taskana.spi.routing.api", "pro.taskana.spi.routing.api",
"pro.taskana.spi.routing.internal",
"pro.taskana.spi.task.api", "pro.taskana.spi.task.api",
"pro.taskana.spi.task.internal" "pro.taskana.spi.task.internal"
); );