package jane.core; import org.apache.mina.core.session.IoSession; /** * RPC处理器的基类(抽象类) * <p> * 此类是BeanHandler的子类 */ public abstract class RpcHandler<A extends Bean<A>, R extends Bean<R>, B extends RpcBean<A, R, B>> extends BeanHandler<B> { /** * RPC请求的处理 * <p> * 处理时rpcBean.arg是传来的请求参数对象, rpcBean.res默认是已初始化的回复对象 * @param manager * @param session * @param rpcBean * @return 返回true且res不为null时会立即自动发送回复, 否则不自动发送回复 */ public boolean onServer(NetManager manager, IoSession session, B rpcBean) throws Exception { return true; } /** * RPC回复的处理 * <p> * 处理时arg是之前发送请求时的参数对象, res是传来的回复对象 * @param manager * @param session * @param rpcBean */ public void onClient(NetManager manager, IoSession session, B rpcBean) throws Exception { } /** * RPC请求后在指定时间内没有收到回复的超时回调 * <p> * 回调时arg是之前发送请求时的参数对象, res无意义,可能为null<br> * 超时时间在RPC的bean中定义<br> * 如果调用了此回调,则即使之后收到该RPC的回复也不会有任何回调处理 * @param manager * @param session * @param rpcBean */ public void onTimeout(NetManager manager, IoSession session, B rpcBean) throws Exception { } @SuppressWarnings("unchecked") final void timeout(NetManager manager, IoSession session, Object rpcBean) throws Exception { onTimeout(manager, session, (B)rpcBean); } @Override public void onProcess(NetManager manager, IoSession session, B rpcBean) throws Exception { if(rpcBean.isRequest()) { R res = rpcBean.getRes(); if(res == null) rpcBean.setRes(rpcBean.createRes()); if(onServer(manager, session, rpcBean)) { rpcBean.setArg(null); rpcBean.setResponse(); manager.send(session, rpcBean); } } else { @SuppressWarnings("unchecked") B rpcbeanOld = (B)NetManager.removeRpc(rpcBean.getRpcId()); if(rpcbeanOld != null) { rpcbeanOld.setSession(null); // 绑定期已过,清除对session的引用 RpcHandler<A, R, B> onClient = rpcbeanOld.getOnClient(); if(onClient != null) rpcbeanOld.setOnClient(null); else onClient = this; rpcbeanOld.setRes(rpcBean.getRes()); onClient.onClient(manager, session, rpcbeanOld); } } } }