-非同期メソッド実行
このまえのオブジェクト同期の逆?で非同期にメソッドを実行する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); }