1

У меня есть вызов службы поддержки для цепочки ответственности, для лучшей производительности мы добавили многопоточность, но не смогли обработать исключение. . Пожалуйста, найдите пример кода: Начиная с Rest Service методЦепь ответственности при многопоточности и обработке исключений в 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

Таким образом, вопросы таковы:

  1. Метод run возвращает void так, есть ли способ обработать исключения, если ConsoleHandler выдает исключение?
  2. Как откат, если второй обработчик выполнен с ошибкой?
+2

Ваш вопрос отсутствует вопрос. – Manu

ответ

1

Вместо непосредственного использования обработки потоков вы можете исследовать классы параллелизма Java. Использование Framework Executor плюс Callable позволило бы вернуть исключение. Затем вы можете реализовать любую обработку/откат исключений.

Одним из примеров Исполнителя Framework и вызываемые объектов здесь: What is recommended way for spawning threads from a servlet in Tomcat

0

Создайте и передайте объект обработчика исключений.

Что-то, что имеет только setError (исключение e) и метод getError().

Каждый поток может установить его (вы можете сделать его addError (исключение e) и составить список исключений).

Вам также нужно будет добавить обратный вызов для каждого из ваших обработчиков, либо для фиксации, либо для отката. Затем в вашей функции более высокого уровня, когда все это будет завершено, спросите, произошли ли ошибки. Если они это сделают, отправьте откат всем обработчикам, иначе отправьте им фиксацию.

+0

Да, мы можем передать объект обработчика исключений в ConsoleHandler, если ConsoleHandler выбрасывает любое исключение, нет объекта ответа для отправки обратно пользователю? поэтому как получить объект исключения в Rest Service (метод dispatchEvent) –

+0

Попросите вашего исполнителя разоблачить его. –

Смежные вопросы