主动对象模式(Active Object)

七、主动对象模式(Active Object)
1、核心思想
一种异步编程思想,允许任务的提交(相当于对异步方法的调用)和任务的执行(相当于异步方法的真正执行)分离,实现了异步编程。
有利于提高并发性,从而提高系统的吞吐率
2、适用场景
适合分解一个比较耗时的任务(如I/O任务)已减少主线程的等待时间。
3、可复用代码
ActiveObjectProxy

public interface RequestPersistence {
    public void store(MMSDeliverReqest request);
}

public class AyncRequestPersistence implements RequestPersistence {

    private static final long ONE_MINITE_IN_SECONDS = 1;
    private final AtomicLong taskTimeConsumerdPerInterval = new AtomicLong(0);
    private final AtomicInteger requestSubmittedPerInterval = new AtomicInteger(0);

    //模式角色 ActiveObject.servent
    private final DiskbasedRequestPersistence delegate = new DiskbasedRequestPersistence();
    //模式角色 ActiveObject.Scheduler
    private final ThreadPoolExecutor scheduler;

    private AyncRequestPersistence(){
        scheduler = new ThreadPoolExecutor(10, 20, 60*ONE_MINITE_IN_SECONDS, TimeUnit.SECONDS,
                //模式角色 ActiveObject.ActivationQueue
                new ArrayBlockingQueue<Runnable>(200),
                new ThreadFactory() {
                    @Override
                    public Thread newThread(Runnable r) {
                        Thread  t;
                        t = new Thread(r, "AyncRequestPersistence");
                        return t;
                    }
                });

        //设置缓存队列饱和策略处理方式为在任务的提交放运行被拒绝的任务
        scheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

        Timer monitorTimer = new Timer(true);
        monitorTimer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println("task count:"+ requestSubmittedPerInterval
                        + ", Queue size:" + scheduler.getQueue().size()
                        + ", taskTimeConsumerdPerInterval:" + taskTimeConsumerdPerInterval.get() + " ms");

                requestSubmittedPerInterval.set(0);
                taskTimeConsumerdPerInterval.set(0);
            }
        }, 0, ONE_MINITE_IN_SECONDS*1000);
    }

    //用于保存AyncRequestPersistence的唯一实例
    private static class InstanceHolder{
        final static RequestPersistence INSTANCE = new AyncRequestPersistence();
    }

    //获取类AyncRequestPersistence的唯一实例
    public static RequestPersistence getInstance(){
        return InstanceHolder.INSTANCE;
    }

    @Override
    public void store(MMSDeliverReqest request) {
        Callable<Boolean> methodRequest = new Callable<Boolean>() {
            @Override
            public Boolean call() throws Exception {
                long start = System.currentTimeMillis();
                try {
                    delegate.store(request);
                } finally{
                    taskTimeConsumerdPerInterval.addAndGet(System.currentTimeMillis() - start);
                }
                return Boolean.TRUE;
            }
        };

        scheduler.submit(methodRequest);
        requestSubmittedPerInterval.incrementAndGet();
    }
}


/**
 * 模式角色 servent
 * @author huzhiqiang
 *
 */
public class DiskbasedRequestPersistence implements RequestPersistence {
    @Override
    public void store(MMSDeliverReqest request) {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}



public class MMSDeliveryServlet {
    public static void main(String[] args) {
        while(true){

            for(int i=0; i<10; i++){
                MMSDeliverReqest request = new MMSDeliverReqest();
                AyncRequestPersistence.getInstance().store(request);
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

/**
 * Active Object 模式Proxy参与者的可复用实现
 * @author huzhiqiang
 *
 */
public abstract class ActiveObjectProxy {
    private static class DispatchInvocationHandler implements InvocationHandler{
        private final Object delegate;
        private final ExecutorService schedler;

        public DispatchInvocationHandler(Object delegate, ExecutorService schedler) {
            super();
            this.delegate = delegate;
            this.schedler = schedler;
        }

        private String makeDelegateMethodName(final Method method, final Object[] arg){
            String name = method.getName();
            name = "do" + Character.toUpperCase(name.charAt(0)) + name.substring(1);
            return name;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // TODO Auto-generated method stub
            Object returnValue = null;
            final Method delegateMethod;

            //如果拦截到的调用方法是异步方法,则将其转发到相应的doXXX方法
            if(Future.class.isAssignableFrom(method.getReturnType())){
                delegateMethod = delegate.getClass().getMethod(makeDelegateMethodName(method, args), 
                        method.getParameterTypes());

                final ExecutorService schedler = this.schedler;

                Callable<Object> methodRequest = new Callable<Object>() {
                    @Override
                    public Object call() throws Exception {
                        Object rv = null;

                        try {
                            rv = delegateMethod.invoke(delegate, args);
                        } catch (Exception e) {
                            throw new Exception(e);
                        }
                        return rv;
                    }
                };

                Future<Object> future = schedler.submit(methodRequest);
                returnValue = future;
            }else{
                //如果拦截到的调用方法不是异步方法,则直接转发
                delegateMethod = delegate.getClass().getMethod(method.getName(), method.getParameterTypes());

                returnValue = delegateMethod.invoke(delegate, args);
            }

            return returnValue;
        }
    }

    /**
     * 生成一个实现指定接口的Active Object proxy 实例
     * 对 interf所定义的异步方法的调用会被转发到servent的相应的doXXX方法
     * @param interf
     * @param servent
     * @param schedler
     * @return
     */
    public static <T> T newInstance(Class<T> interf, Object servent, ExecutorService schedler){
        @SuppressWarnings("unchecked")
        T f = (T) Proxy.newProxyInstance(interf.getClassLoader(), new Class[] { interf }, 
                new DispatchInvocationHandler(servent, schedler));

        return f;
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值