java - java 中的多线程和异常处理的责任链

标签 java jakarta-ee design-patterns architecture chain-of-responsibility

我有一个责任链的Rest服务调用,为了更好的性能,我们添加了多线程,但无法处理异常 请查找代码示例:从Rest Service方法开始

 @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;
    }
}

处理程序.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. 如果第二个处理程序执行失败,如何回滚?

最佳答案

您可以研究 Java 并发类,而不是直接实现线程处理。使用 Executor 框架加上 Callable 将允许返回异常。然后,您可以实现您希望的任何异常处理/回滚。

执行器框架和可调用对象的一个​​示例如下:What is recommended way for spawning threads from a servlet in Tomcat

关于java - java 中的多线程和异常处理的责任链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29515919/

相关文章:

java - 如何将 NSString 转换为字节数组

java - 关于在java中读取ZipInputStream/ZipEntry的问题

javascript - 使用Java Servlet下载动态文件

java - 实现空对象模式的方法

ios - iOS 应用的推荐控件或页面流

java - XSD 转 Java,指定使用 Java HashMap

java - 当我按下按钮时,如何使不同类的方法启动?

database - 如何在 EJB 3 中为每个方法设置隔离级别

java - 为什么我无法访问这个放入 Model 对象的列表到这个 Spring MVC 项目中?

c# - 多线程设计模式