在一个最近的项目中,我遇到了一个有趣的问题:采用被赋予单个对象的服务方法,并在一个夜间过程的上下文中重用相同的代码,该过程独立于应用程序而在数千个相同类型的对象上运行。

试图在两个地方维护如此大小和复杂性的相同过程真是荒谬的,所以我需要找到一种共享代码的方法。 一种可能的解决方案是使用DeltaSpike (Apache的CDI扩展集合)提供一种从主要Java / JPA / Hibernate应用程序访问实体和类的简单方法。

似乎有足够的文档来使DeltaSpike在网络上的类似情况下运行,但是人们对此应用程序的可行性持怀疑态度。 我的团队无法使它在项目的其他部分工作,因此继续使用Spring Batch。

最大的障碍是无法创建功能性的EntityManager,无论他们如何紧密地遵循可以找到的文档和示例。 该项目的较小部分为实现DeltaSpike提供了另一个很好的候选人,但是在对以下教程非常熟悉之后,找到了操作方法,并阅读了正式的实现说明,我被困在同一个地方:EntityManager将无法工作,至少不能与我面前的技术和版本组合使用。

幸运的是,我能够将弗兰肯斯坦的一些教程和示例中的部分放在一起,以针对我的情况获得可行的DeltaSpike实现,因此我想我会分享我发现的内容,因此下次其他人可能会更轻松一些。

基础

首先,我正在使用Maven,因此这里是您需要添加的依赖项:

<dependency><groupId>org.apache.deltaspike.cdictrl</groupId><artifactId>deltaspike-cdictrl-api</artifactId><version>1.2.1</version><scope>compile</scope>
</dependency><dependency><groupId>org.jboss.weld.se</groupId><artifactId>weld-se</artifactId><version>1.1.16.Final</version><scope>runtime</scope>
</dependency><dependency><groupId>org.apache.deltaspike.cdictrl</groupId><artifactId>deltaspike-cdictrl-weld</artifactId><version>1.2.1</version><scope>runtime</scope>
</dependency><dependency><groupId>org.apache.deltaspike.core</groupId><artifactId>deltaspike-core-api</artifactId><version>1.5.0</version>
</dependency><dependency><groupId>org.apache.deltaspike.modules</groupId><artifactId>deltaspike-jpa-module-api</artifactId><version>1.4.0</version>
</dependency><dependency><groupId>org.apache.deltaspike.modules</groupId><artifactId>deltaspike-jpa-module-impl</artifactId><version>1.4.0</version>
</dependency>

如您所见,我们正在考虑在一个也需要JBoss / Weld的项目中实现DeltaSpike。 我所依赖的其他依赖项包括javax.enterprise,Hibernate和JPA。 根据最终的实现,您可能不需要所有这些DeltaSpike依赖项,因此请确保在完成后清理pom.xml。

应用程式

对于我的示例,我将使用一个基本的Application类,该类遵循您在其他DeltaSpike示例中可能看到的模式:

import javax.enterprise.context.ApplicationScoped;
import org.apache.deltaspike.cdise.api.CdiContainer;
import org.apache.deltaspike.cdise.api.CdiContainerLoader;
import org.apache.deltaspike.cdise.api.ContextControl;
import org.apache.deltaspike.core.api.config.ConfigResolver;public class Application {public static void main(String[] args) {CdiContainer cdiContainer = CdiContainerLoader.getCdiContainer();cdiContainer.boot();ContextControl contextControl = cdiContainer.getContextControl();contextControl.startContext(ApplicationScoped.class);//Your code herecdiContainer.shutdown();}
}

特别注意这一行:

contextControl.startContext(ApplicationScoped.class);

该行查找带有@ApplicationScoped批注的类,这些类需要包含在上下文中。

EntityManagerProducer

这是棘手的地方。 遵循典型的DeltaSpike教程,将为您提供一个类似于以下内容的EntityManagerProducer:

@ApplicationScoped
public class EntityManagerProducer
{@PersistenceUnitprivate EntityManagerFactory entityManagerFactory;@Produces@Default@RequestScopedpublic EntityManager create(){return this.entityManagerFactory.createEntityManager();}public void dispose(@Disposes @Default EntityManager entityManager){if (entityManager.isOpen()){entityManager.close();}}
}

考虑到我要处理的各种因素,我唯一遇到的问题是根本不起作用。 无论我尝试了什么,EntityManager始终为null。 我怀疑EntityManagerFactory不能正常工作,所以我做了一些挖掘,发现这种获取EntityManagerFactory的方法:

private EntityManagerFactory entityManagerFactory =
Persistence.createEntityManagerFactory("PERSISTENCE_UNIT", setProperties());

使用此方法,我可以基于在persistence.xml中定义的持久性单元(它具有我在参数中提供的名称)来获得一个有效的EntityManagerFactory。 在这里,我定义了应用程序需要成为EntityManagerFactory一部分的实体,以便能够执行诸如运行之类的小事情。

这是新的和改进的EntityManagerProducer的外观:

@ApplicationScoped
public class EntityManagerProducer {private EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("PERSISTENCE_UNIT", setProperties());private EntityManager entityManager;protected void closeEntityManager(@Disposes EntityManager entityManager) {if (entityManager.isOpen()) {entityManager.close();}}@Producesprotected EntityManager createEntityManager() {if (entityManager == null) {entityManager = entityManagerFactory.createEntityManager();}return entityManager;}protected Properties setProperties() {properties.setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");properties.setProperty("hibernate.show_sql", "false");properties.setProperty("hibernate.hbm2ddl.auto", "none");properties.setProperty("hibernate.enable_lazy_load_no_trans", "true");properties.setProperty("hibernate.jdbc.batch_size", "20");properties.setProperty("hibernate.connection.driver_class", "oracle.jdbc.driver.OracleDriver");properties.setProperty("hibernate.connection.url", "JDBC_URL");properties.setProperty("hibernate.default_schema", System.getProperty("SCHEMA_NAME"));properties.setProperty("javax.persistence.jdbc.user", System.getProperty("USER"));properties.setProperty("javax.persistence.jdbc.password", System.getProperty("PASSWORD"));properties.setProperty("org.hibernate.flushMode", "ALWAYS");return properties;}}

注意@ApplicationScoped标签; 这样可以确保在启动CDI容器时将此类包含在上下文中。 还要注意,您可以设置属性以将其传递到您创建的EntityManagerFactory中,包括从服务器参数中的系统属性中获取它们,如果环境变量可能会更改应用程序的功能,这将非常有用。

最后的想法

希望这为如何设置和实现DeltaSpike提供了一个简单有效的示例。

旁注:我最终无法使用这种方法来解决问题,因为要处理的对象数量比预期的要大得多(几百万个),但是我认为分享发现的内容仍然有用。

翻译自: https://www.javacodegeeks.com/2016/01/working-deltaspike-tutorial.html

可行的DeltaSpike教程相关推荐

  1. python程序打包成exe可执行文件,亲测可行(pyinstaller教程)

    python程序打包成exe可执行文件,亲测可行(pyinstaller教程)(11-20190214) 文章目录: 有些程序你不想让别人看到,由此程序你想做成绿色软件普惠大众,有些..., 然而你只 ...

  2. 最新 Linux安装项目环境 mysql 完整教程 100%可行.附带所有教程

    1.环境背景(2019-7-15) mysql的版本(MySQL-5.6.22-1.el6.i686.rpm-bundle.tar) 链接:https://pan.baidu.com/s/1-tXGG ...

  3. 腾讯云服务器 linux 镜像安装项目环境mysql心得

    问题总结 1.报错信息 failed dependencies 解决方案 卸载 mysql 然后重新解压 然后执行命令 yum install libaio.so.1 使用 下面的命令查看密码 cat ...

  4. 自由能计算专题3:gromacs计算自由能的7种方法案例

    前言 本教程以甲烷在水中的溶剂化自由能和配体与受体蛋白质结合自由能为入门和进阶例子对使用分子动力学模拟方法来计算自由能的常见方法给出了示例,教程不会过多讲解各种计算自由能方法原理和分析原理,关于自由能 ...

  5. 面向智慧教室物联网关键技术的研究与运用(待完成)

    毕设过程随笔 第一周(2.3-2.7) 2月3日 2月4日 2月5日 2月6日 2月7日 第二周(2.22-2.28) 2月22日 2月23日 2月24日 2月25日 2月26日 2月27日 第三周( ...

  6. 最快往服务器拷贝数据,往小米路由器硬盘拷贝数据最快速的方法

    插电-刷开发版rom-往里考东西~ 不过问题来了.....1T的2.5寸硬盘 , 目前来说算是最大的了, 本想把家里现有服务器中的电影 音乐等数百G的东西考过去,最快的方式无疑的直接把路由器中的硬盘接 ...

  7. 使用Matlab2019b生成的音频插件(VSTPlugin)在音频工作站(DAW)中进行测试

    根据之前生成的DLL文件,在音频工作站(DAW)中进行使用,验证是否可行. 官方教程 通过在效果里可以找到对应的VST插件效果. 然后运行,即可测试算法性能. Copyright © 2020 by ...

  8. 三星S5 电信版(G9009D)Android 5.0系统,root教程【亲测可行】

    本人用三星S5手机做安卓应用开发,发现没有root权限调试时有诸多不便,于是决定要获取root.找遍了所有一键root工具均无可用方案.最后卡刷root包成功,记录如下. 一.说明:S5手机出厂自带的 ...

  9. Android5手动root,魅蓝Note5如何获取ROOT权限?魅蓝Note5 ROOT教程(亲测可行)

    手机ROOT之后可以获得更多的系统权限,例如删除自带软件,修改字体以及系统设置等等.但是ROOT之后也会有很多安全方面的漏洞,小编建议小白用户不要尝试自己进行ROOT,有过刷机经验的发烧友可以尝试RO ...

最新文章

  1. 一篇带你了解函数指针
  2. XStream xml与javabean之间的互转
  3. java私有成员的访问_java – 使用私有成员或公共访问器的方法
  4. 开学啦!你还焦躁吗?
  5. pgadmin连接服务器失败_增值税发票税控软件:连接服务器失败是否使用离线文件进行更新?...
  6. 在Filfter中使用注解了spring 的bean,报javax.naming.NamingException: Cannot create resource instance...
  7. eclipse不能自动编译工程的解决方法
  8. 一、bootstrap table 初体验
  9. 个人第三次软件工程作业-效能分析
  10. 无人机——磁力计/电子罗盘 学习及校准
  11. Python 寻找完美数
  12. 设计一个AOA蓝牙精准室内定位系统
  13. python实现文本编辑器_Python实现的文本编辑器功能示例
  14. 校园招聘-2017美团后台开发内推笔试编程题
  15. 关于企业邮箱域名备案方法【企业邮箱申请】
  16. 取消UL和OL符号以及padding和margin后恢复默认值的CSS
  17. 新中式穿搭:柯罗芭KLOVA传承极致东方美
  18. ChatGPT的各种骚操作
  19. 原创如何批量修改文件名称,合并ts文件片段
  20. 基于python的selenium两种文件上传方式

热门文章

  1. 通往大神之路,百度Java面试题前200页。
  2. 漫画:Bitmap算法 整合版
  3. TS字面量进行类型声明
  4. 2015蓝桥杯省赛---java---A---2(星系炸弹)
  5. 用赫夫曼树进行文件解压
  6. String常用的方法总结
  7. java中int转成String位数不足前面补零 java格式化2位数不足补零
  8. 第8步 第2剑客 mybatis plugin 第三剑客 page helper csdn每天最多发多少文章 是20篇,刚刚才试了。2014
  9. 面试项目 java-服务端 18h58
  10. es6箭头函数(墙裂推荐)