1

一連の責任のために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;
    }
}

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 番目のハンドラーが失敗した場合にロールバックする方法は?
4

2 に答える 2

1

例外ハンドラ オブジェクトを作成して渡します。

setError(Exception e) と getError() メソッドだけを持つもの。

各スレッドはそれを設定できます (addError(Exception e) にして、例外のリストを作成できます)。

また、コミットまたはロールバックするために、各ハンドラーにコールバックを追加する必要があります。次に、上位レベルの関数で、これらがすべて完了したら、エラーが発生したかどうかを尋ねます。そうである場合は、すべてのハンドラーにロールバックを送信し、そうでない場合はそれらにコミットを送信します。

于 2015-04-08T14:34:41.593 に答える
1

スレッド処理を直接実装する代わりに、Java 同時実行クラスを調べることができます。Executor フレームワークと Callable を使用すると、例外を返すことができます。その後、必要な例外処理/ロールバックを実装できます。

Executor Framework と Callables の一例は次のとおりです: Tomcat でサーブレットからスレッドを生成するための推奨される方法は何ですか?

于 2015-04-08T14:34:57.473 に答える