Цепочка ответственности с многопоточностью и обработкой исключений в Java
У меня есть вызов службы отдыха для цепи ответственности, для повышения производительности мы добавили многопоточность, но не смогли обработать исключение. Найдите пример кода: Начиная с метода службы отдыха
@POST
@Path("/dispatch")
public Response dispatchEvent(){
Thread steps = new Thread(new HandlerExecutor());
steps.start();
}
HandlerExecutor.java:
public class HandlerExecutor implements Runnable {
@Override
public void run() {
Handler first = HandlerLocator.getHandler();
if (first != null) {
first.process();
}
}
}
HandlerLocator.java:
public class HandlerLocator {
public static Map<String, List<Handler>> allHandlers = null;
public static Handler getHandler() {
Handler first = null;
List<Handler>> h = new HashMap<String, List<Handler>>();
List<Handler> list = new ArrayList<Handler>();
list.add(new ConsoleHandler());
list.add(new FileHandler());
list.add(new FinalHandler());
h.put("1", list);
List<Handler> clientHandlers = h.get("1");
if (clientHandlers != null) {
int size = clientHandlers.size();
Handler h1, prev = null;
for (int i = 0; i < size; i++) {
h1 = (Handler) clientHandlers.get(i);
if (first == null) {
first = h1;
} else {
prev.setNext(h1);
}
prev = h1;
}
}
return first;
}
}
Handler.java:
public interface Handler extends Serializable {
Handler setNext(Handler next);
void process();
}
BasicHandler.java
public abstract class BasicHandler implements Handler {
private Handler next;
public BasicHandler() {
this.next = null;
}
@Override
public Handler setNext(Handler next) {
this.next = next;
return next;
}
@Override
public void process() {
doProcess();
if (next != null) {
next.process();
} else {
// done
}
}
public abstract void doProcess() ;
}
public class ConsoleHandler extends BasicHandler {
@Override
public void doProcess() {
System.out.println("processed ConsoleHandler");
}
}
так же, как ConsoleHandler у нас есть FileHandler,FinalHandlers
Итак, вопросы таковы:
- Метод run возвращает void, есть ли способ обработать исключения, если
ConsoleHandler
бросает исключение? - Как откатиться, если сработал второй обработчик?
2 ответа
Вместо непосредственной реализации обработки потока вы можете исследовать классы параллелизма Java. Использование среды Executor плюс Callable позволит вернуть исключение. Затем вы можете реализовать любую обработку / откат исключений, какую пожелаете.
Один пример Executor Framework и Callables приведен здесь: Какой рекомендуемый способ порождения потоков из сервлета в Tomcat
Создайте и передайте объект обработчика исключений.
Кое-что, что имеет метод setError(Exception e) и метод getError().
Каждый поток может установить его (вы можете сделать это addError(Exception e) и составить список исключений).
Вам также нужно будет добавить обратный вызов для каждого из ваших обработчиков, чтобы зафиксировать или откатить. Затем в вашей высокоуровневой функции, когда все это завершится, спросите, произошли ли ошибки. Если они это сделали, отправьте откат всем обработчикам, в противном случае отправьте им коммит.