java 中多线程和异常处理的责任链
Chain of Responsibility with multithreading and exception handling in java
我有一个责任链的 Rest 服务调用,为了更好的性能,我们添加了多线程但无法处理异常
请找到代码示例:Starting with Rest Service method
@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();
}
基本Handler.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
所以,问题是:
- 运行 方法返回 void 那么,如果
ConsoleHandler
抛出异常,有什么方法可以处理异常吗?
- 第二个handler执行失败如何回滚?
创建并传入异常处理程序对象。
只有一个 setError(Exception e) 和一个 getError() 方法的东西。
每个线程都可以设置它(你可以将它设为 addError(Exception e) 并制作一个异常列表)。
您还需要为每个处理程序添加回调,以提交或回滚。然后在你的高级函数中,当这些都完成后,询问是否发生错误。如果他们这样做了,则向所有处理程序发送回滚,否则向他们发送提交。
您可以调查 Java 并发性 类,而不是直接实施线程处理。使用 Executor 框架加上 Callable 将允许 return 异常。然后你可以实现你想要的任何异常handling/rollback。
Executor Framework 和 Callables 的一个例子在这里:What is recommended way for spawning threads from a servlet in Tomcat
我有一个责任链的 Rest 服务调用,为了更好的性能,我们添加了多线程但无法处理异常 请找到代码示例:Starting with Rest Service method
@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();
}
基本Handler.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
所以,问题是:
- 运行 方法返回 void 那么,如果
ConsoleHandler
抛出异常,有什么方法可以处理异常吗? - 第二个handler执行失败如何回滚?
创建并传入异常处理程序对象。
只有一个 setError(Exception e) 和一个 getError() 方法的东西。
每个线程都可以设置它(你可以将它设为 addError(Exception e) 并制作一个异常列表)。
您还需要为每个处理程序添加回调,以提交或回滚。然后在你的高级函数中,当这些都完成后,询问是否发生错误。如果他们这样做了,则向所有处理程序发送回滚,否则向他们发送提交。
您可以调查 Java 并发性 类,而不是直接实施线程处理。使用 Executor 框架加上 Callable 将允许 return 异常。然后你可以实现你想要的任何异常handling/rollback。
Executor Framework 和 Callables 的一个例子在这里:What is recommended way for spawning threads from a servlet in Tomcat