可行的DeltaSpike教程

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

试图在两个地方维护如此大小和复杂性的相同过程真是荒谬的,所以我需要找到一种共享代码的方法。 一种可能的解决方案是使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2017/3/8 函数指针/事件/委托....

函数指针&#xff1a; 定义&#xff1a;函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量&#xff0c;只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样&#xff0c;这里是指向函数。 函数指针有两个用途&#xff1a;调用函数…

java finalize 析构_close,析构函数和finalize:Java矛盾

try { FileInputStream in new FileInputStream(filename);BufferedReader readernew BufferedReader(new InputStreamReader(in));String line;while((linereader.readLine())!null){// read the file}}catch (Exception e) {System.out.println(e);}但是如果我尝试将命令添加…

sharesdk短信验证码的集成

在ShareSDK官网http://mob.com/注册并创建Android应用.申请APP_key,下载SDK等 根据官网开发文档导入SDK,目录结构如下 将以上文件按需放入Android Studio项目所要使用SMSSDK的Module所在的Libs里面&#xff0c;再在Module的build.gradle里面将libs加入仓库&#xff08;reposito…

java四神兽_SpringCloud五大神兽之Eureka

注册中心概述什么是注册中心&#xff1f;相当于服务之间的‘通讯录’&#xff0c;记录了服务和服务地址之间的映射关系。在分布式架构中服务会注册到这里。当服务需要调用其他服务时&#xff0c;就在注册中心找到其他服务的地址&#xff0c;进行调用注册中心的主要作用&#xf…

Mockito入门

本文是我们名为“ 用Mockito进行测试 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入了解Mockito的魔力。 您将了解有关“模拟”&#xff0c;“间谍”和“部分模拟”的信息&#xff0c;以及它们相应的Stubbing行为。 您还将看到使用测试双打和对象匹配器进行验证的过…

windows下dubbo-admin和zookeeper安装部署

1. 概述 ZooKeeper是Hadoop的正式子项目&#xff0c;它是一个针对大型分布式系统的可靠协调系统&#xff0c;提供的功能包括&#xff1a;配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务&#xff0c;将简单易用的接口和性能高效、…

jpush java api_JPush極光推送Java服務器端API

產品功能說明極光推送(JPush)是一個端到端的推送服務&#xff0c;使得服務器端消息能夠及時地推送到終端用戶手機上&#xff0c;讓開發者積極地保持與用戶的連接&#xff0c;從而提高用戶活躍度、提高應用的留存率。極光推送客戶端支持 Android, iOS 兩個平台。本 Android SDK …

Maven详解(转)

转自 https://www.cnblogs.com/hongwz/p/5456578.html 一.前言 以前做过的项目中&#xff0c;没有真正的使用过Maven&#xff0c;只知道其名声很大&#xff0c;其作用是用来管理jar 包的。最近一段时间在项目过程中使用Maven&#xff0c;用Maven构建的web项目&#xff0c;其项目…

javafx性能_对JavaFX Mobile应用程序进行性能分析

javafx性能注意&#xff1a;本文最初发表于2009年&#xff0c;仅供参考。 请查阅我们其余的JavaFX文章 。 对于每个JavaFX Mobile应用程序开发人员而言&#xff0c;今天都是美好的一天。 你想知道为什么吗&#xff1f; 因为JavaME SDK 3.0已发布。 根据我午休时听到的消息&…

egg.js java 生产数据_Egg 2.15.0 发布,阿里开源的企业级 Node.js 框架

值得注意的变化新特性[EXPERIMENT FEATURE] 支持单线程模式Bug 修复[TYPE] 支持config.static.dir的数组[TYPE] 修复中间件类型不兼容[TYPE] 修复当 esModuleInterop 为 true 时类型错误的bug其他优化文档设计原则企业级应用在追求规范和共建的同时&#xff0c;还需要考虑如何平…

SpringMVC工作原理

Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色&#xff0c;这种分离让它们更容易进行定制。 Spring的MVC框架主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。 SpringMVC原理图 SpringMVC接口解释&#xff1a; DispatcherSer…

2015年的Java –重大事件

2015年是Java的一年&#xff0c;语言&#xff0c;平台&#xff0c;生态系统和社区继续主导着软件领域&#xff0c;只有Javascript对整个行业产生了类似的影响。 如果您错过了2015年的亮点&#xff0c;这里是发生的一些重大事件。 Java 20岁了&#xff0c;还没有死&#xff01;…

java商品编写代码_商品品牌业务之后台Java代码的编写

今天是刘小爱自学Java的第146天。感谢你的观看&#xff0c;谢谢你。商品品牌业务之后台Java代码的编写-1.jpg (50.46 KB, 下载次数: 1)2021-2-5 00:22 上传学习计划安排如下&#xff1a;昨天实现了前端页面的编写以及发送请求&#xff0c;今天关于异步请求工具axios的简单说明。…

java中8种数据类型和默认值所占字节数

java 8种基本数据类型的默认值及所占字节数通过一段代码来测试一下 8种基本数据类型的默认值 1 package dierge;2 3 public class Ceshi { 4 int a; 5 double b; 6 boolean c; 7 char d; 8 float f; 9 byte e; 10 long h; 11 short j; 12 public static void main(String…

软件测试实验1:为三角形问题编写一个Java程序,并用Junit测试程序

实验报告 实验内容&#xff1a; 1.Install Junit(4.12), Hamcrest(1.3) with Eclipse 2.Install Eclemma with Eclipse 3.Write a java program for the triangle problem and test the program with Junit. 实验步骤&#xff1a; 1.在eclipse中安装Junit、Hamcrest和eclemma。…

java避免空指针异常_避免Java中的空指针异常

java避免空指针异常空指针异常是Java中最常见&#xff0c;最烦人的异常。 在这篇文章中&#xff0c;我想避免这种不希望的异常。 首先让我们创建引发空指针异常的示例 private Boolean isFinished(String status) { if (status.equalsIgnoreCase("Finish")) { ret…

比java好的_Java Spring真的比直接进行Java编程好吗

我已经读过依赖注入对于测试是有好处的,因为可以在没有依赖的情况下测试一个类,但是我想到的问题是,如果A类依赖于B或C或任何类,则独立于某个类的A类测试就是得出的测试结果为零,而不是失败或过去的测试.创建A类是为了执行某些操作,如果无论是使用新关键字还是在Spring中设置多…

SurfaceFlinger与Surface概述

基本原理&#xff1a; SF一个Client对应一个app中的SurfaceComposerClient&#xff0c; 分别是Binder的n端和b端&#xff0c;主要用来CreateSurface 一个app中有多个Activity&#xff0c;一个Activity一般有一个Surface(除SurfaceView&#xff0c;一个View就有一个Surface)&…

拼图项目动手指南

Jigsaw项目将把模块化引入Java平台&#xff0c;根据原始计划&#xff0c;它将在12月10日完成功能。 所以我们在这里&#xff0c;但是拼图在哪里&#xff1f; 在过去的六个月中肯定发生了很多事情&#xff1a; 原型问世 &#xff0c;内部API的迫在眉睫的删除引起了很大的骚动 &…

java实现回文验证_LeetCode 精选 TOP 面试题(Java 实现)—— 验证回文串

文章目录一、题目描述1.1 题目验证回文串给定一个字符串&#xff0c;验证它是否是回文串&#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。说明&#xff1a;本题中&#xff0c;我们将空字符串定义为有效的回文串。示例 1:输入: "A man, a plan, a cana…