ofbiz实体引擎(一) 获取Delegator

public abstract class DelegatorFactory implements Factory<Delegator, String> {
    public static final String module = DelegatorFactoryImpl.class.getName();
    private static final ConcurrentHashMap<String, Future<Delegator>> delegators = new ConcurrentHashMap<String, Future<Delegator>>();
    private static final ThreadGroup DELEGATOR_THREAD_GROUP = new ThreadGroup("DelegatorFactory");
    private static final ScheduledExecutorService executor = ExecutionPool.getScheduledExecutor(DELEGATOR_THREAD_GROUP, "delegator-startup", Runtime.getRuntime().availableProcessors(), 10, true);

    /**
     *@author 郑小康
     *
     * 根据delegatorName调用getDelegatorFuture方法,获取当前delegator的 Future<Delegator>
     *
     * 而后调用get方法获取Delegator实例
     *
     * */
    public static Delegator getDelegator(String delegatorName) {
        Future<Delegator> future = getDelegatorFuture(delegatorName);
        try {
            return future.get();
        } catch (ExecutionException e) {
            Debug.logError(e, module);
            return null;
        } catch (InterruptedException e) {
            Debug.logError(e, module);
            return null;
        }
    }

    /**
     * @author 郑小康
     *
     * 根据delegatorName获取Future<Delegator> 如果为空,新创建一个FutureTask<Delegator>将其加入到缓存中去
     *
     * 将这个futureTask给提交到线程池,futureTask中存放的是DelegatorConfigurable实例对象
     *
     *
     * */
    public static Future<Delegator> getDelegatorFuture(String delegatorName) {
        if (delegatorName == null) {
            delegatorName = "default";
            //Debug.logWarning(new Exception("Location where getting delegator with null name"), "Got a getGenericDelegator call with a null delegatorName, assuming default for the name.", module);
        }
        do {
            Future<Delegator> future = delegators.get(delegatorName);
            if (future != null) {
                //Debug.logInfo("got delegator(future(" + delegatorName + ")) from cache", module);
                return future;
            }
            FutureTask<Delegator> futureTask = new FutureTask<Delegator>(new DelegatorConfigurable(delegatorName));
            //Debug.logInfo("putting delegator(future(" + delegatorName + ")) into cache", module);
            if (delegators.putIfAbsent(delegatorName, futureTask) != null) {
                continue;
            }
            executor.submit(futureTask);
        } while (true);
    }


    public static final class DelegatorConfigurable implements Callable<Delegator> {
        private final String delegatorName;

        public DelegatorConfigurable(String delegatorName) {
            this.delegatorName = delegatorName;
        }

        /**
         * 获取delegator的具体方法
         * 并做了分布式缓存和ECA Handler FIXME:未研究
         * */
        public Delegator call() throws ClassNotFoundException {
            try {
                Delegator delegator = UtilObject.getObjectFromFactory(DelegatorFactory.class, delegatorName);

                // setup the Entity ECA Handler
                delegator.initEntityEcaHandler();

                // setup the distributed CacheClear
                delegator.initDistributedCacheClear();

                return delegator;
            } catch (ClassNotFoundException e) {
                Debug.logError(e, module);
                throw e;
            }
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android相关

Java线程池---ShutDown以及ShutDownNow解析

初始化一个有序的关闭,之前提交的任务都会被执行,但是新提交的任务则不会被允许放入任务队列中。如果之前被调用过了的话,那么再次调用也没什么用。这个方法不会等待之前...

12020
来自专栏函数式编程语言及工具

浅谈Slick(2)- Slick101:第一个动手尝试的项目

   看完Slick官方网站上关于Slick3.1.1技术文档后决定开始动手建一个项目来尝试一下Slick功能的具体使用方法。我把这个过程中的一些了解和想法记录...

28790
来自专栏不会写文章的程序员不是好厨师

利用LockSupport实现简单Future

上篇文章已经讲到了LockSupport提供的功能,以及如何使用LockSupport实现锁的语义,本文将介绍Future的语义以及如何利用LockSuppor...

9830
来自专栏wannshan(javaer,RPC)

JDK7 ThreadPoolExecutor execute(Runnable command) 方法解析

/** * 通过这个方法提交的线程,将在新的线程,或者已有的(线程池)线程中执行 * * * If the task ...

54560
来自专栏会跳舞的机器人

java并发编程的艺术第十章——Executor框架

Executor框架的主要成员:ThreadPoolExecutor、ScheduledThreadPoolExecutor、Future接口、Runnable...

12520
来自专栏Java编程技术

Java中调度线程池ScheduledThreadPoolExecutor原理探究

前面讲解过Java中线程池ThreadPoolExecutor原理探究,ThreadPoolExecutor是Executors中一部分功能,下面来介绍另外一部...

16120
来自专栏函数式编程语言及工具

浅谈Slick(4)- Slick301:我的Slick开发项目设置

  前面几篇介绍里尝试了一些Slick的功能和使用方式,看来基本可以满足用scala语言进行数据库操作编程的要求,而且有些代码可以通过函数式编程模式来实现。我想...

238100
来自专栏向治洪

java线程池ThreadPoolExecutor 如何与 AsyncTask() 组合使用

简单说下Executors类,提供的一系列创建线程池的方法: 他们都有两个构造方法 1. --------newFixedThreadPool (创建一个定长线...

20480
来自专栏Java编程技术

FutureTask 原理

如上代码主线程会在futureTask.get()出阻塞直到task任务执行完毕,并且会返回结果。

10510
来自专栏张善友的专栏

按照Web Service方式调用WCF服务的问题

WCF按照basicHttpBinding方式发布,.net按照Web Service方式调用,自动生成的Proxy中枚举类型和Nullable类型的参数,在P...

21870

扫码关注云+社区

领取腾讯云代金券