-非同期メソッド実行

このまえのオブジェクト同期の逆?で非同期にメソッドを実行するAdviceをSeasar2で作ってみました。
ひがさんからコメントはいりましたので、参考にして追加開発してみました。

package org.seasar.framework.aop.advices;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.seasar.framework.aop.AroundAdvice;
import org.seasar.framework.aop.Joinpoint;
public class AsyncCallAdvice implements AroundAdvice {
  private Set callbacks = new HashSet();
  public void addCallback(AsyncCallback callback) {
    callbacks.add(callback); 
  }
  private void fireSuccess(Object ret, Joinpoint joinpoint) {
    for(Iterator it = callbacks.iterator(); it.hasNext();) {
      AsyncCallback callback = (AsyncCallback)it.next();
      callback.success(ret, 
        joinpoint.getTarget(), joinpoint.getMethod(), joinpoint.getArgs());
      
    }
  }
  private void fireFault(Throwable t, Joinpoint joinpoint) {
    for(Iterator it = callbacks.iterator(); it.hasNext();) {
      AsyncCallback callback = (AsyncCallback)it.next();
      callback.fault(t, 
        joinpoint.getTarget(), joinpoint.getMethod(), joinpoint.getArgs());
    }
  }
  private class AsyncRunner implements Runnable {
    private Joinpoint joinpoint;
    public AsyncRunner(Joinpoint joinpoint) {
      this.joinpoint = joinpoint;
    }
    public void run() {
      try {
        Object ret = joinpoint.proceed();
        fireSuccess(ret, joinpoint);
      } catch(Throwable t) {
        fireFault(t, joinpoint);
      }
    }
  }
  public Object invoke(Joinpoint joinpoint) throws Throwable {
    AsyncRunner runner = new AsyncRunner(joinpoint);
    Thread thread = new Thread(runner);
    thread.start();
    return null;
  }
}

ハンドラのインターフェイスです。

package org.seasar.framework.aop.advices;
import java.lang.reflect.Method;
public interface AsyncCallback {
  public void success(Object ret, Object target, Method method, Object args);
  public void fault(Throwable t, Object target, Method method, Object args);
}