ofbiz实体引擎(一) 获取Delegator
时间:2022-05-03
本文章向大家介绍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;
}
}
}
}
- golang 详解defer
- Hive多分隔符支持示例
- golang调试工具Delve
- Git 项目推荐 | 分布式系统唯一 ID 生成方法
- keepalived双机热备nginx
- Git 项目推荐 | 开源 PHP 加密运行扩展
- Git 项目推荐 | 基于 J2Cache 的多级缓存框架
- 如何将生产环境的字段类型从INT修改为BIGINT
- 如何高效的使用PowerShell备份数据库
- Git 项目推荐 | Java 版按键精灵
- Elasticsearch-精确查找
- Git 项目推荐 | 图片验证码生成库
- Elasticsearch-深入理解索引原理
- Git 项目推荐 | html5 异步批量上传插件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- android 限制某个操作每天只能操作指定的次数(示例代码详解)
- pymysql connect 连接mysql 报错keyerror255
- 使用android studio开发工具编译GBK转换三方库iconv的方法
- Android在类微信程序中实现蓝牙聊天功能的示例代码
- python中的yield和return—迭代器和生成器
- Android studio有关侧滑的实现代码
- 图片按照宽度等比例缩放
- Android 自定义加载动画Dialog弹窗效果的示例代码
- flutter的环境安装配置问题及解决方法
- (新)关于修改window.navigator.webdriver代码失效问题
- Android底部导航栏的三种风格实现
- Android Studio3.2中导出jar包的过程详解
- Android自定义view实现标签栏功能(只支持固定两个标签)
- python 爬虫之selenium可视化爬虫
- Android Studio3.6.+ 插件搜索不到终极解决方案(图文详解)