使用NoSQL实现实体服务–第4部分:Java EE

现在,我已经准备好了框架式的合同优先型Web服务,并使用Ektorp和CouchDB创建了数据访问层 ,是时候将它们连接到一个可以正常工作的实体服务中了 。 为此,我将使用Java EE和Glassfish 3.1。

值得注意的是,对于他的那种R&D工作,我完全不需要使用Java EE。 我不需要像Glassfish这样的JEE服务器所提供的安全性或交易功能,我可能可以使用比Tomcat或Jetty轻一些的东西。 但是,我喜欢JEE的便利性和功能,许多在像Tomcat这样的标准Java应用程序服务器上开始使用的应用程序最终都会将JEE功能移植到Tomcat中(例如JAX-WS)或迁移到完整的JEE服务器(例如玻璃鱼。

Tomcat的用户经常需要JEE功能-这是在Apache上启动TomEE项目的主要理由。 该项目将JEE Web Profile功能添加到普通的Tomcat堆栈中,因此它可以处理EJB和JAX-WS之类的事情。

将业务逻辑分为Bean。

我的应用程序已经有2个不同的层。 第一个(从消费者的角度来看)是Web服务层,其任务是提供所有Web服务操作以及其他服务特定任务,例如处理定制SOAP标头和消息传递元数据 ,这些问题有助于解决幂等问题。 最后一层是数据库访问层 ,负责与数据库通信以及处理我的Product实体的持久性和检索。

我现在要添加的第三层也是最后一层是连接前两层的中间层-业务逻辑层。 该层将负责实施产品实体服务的规则和决策,例如确保在执行持久性操作之前,存在,添加或验证任何语义上重要的信息。

这种语义上重要的信息的一个例子是产品的“状态”。 在我的模型中,我允许产品在多个状态之间转换,以维持严格的产品生命周期。 这些阶段如下,并且本质上是线性的(每个状态都跟随最后一个状态)…

  • 临时
  • 有货
  • 可售
  • 已停产
  • 已删除

在我的业务逻辑层中,我的Product Manager bean确保每个实体的状态对于每个服务操作都有意义。 例如,如果您对Product调用createProduct()操作,则给定的Product必须具有“临时”状态。 如果没有,我的逻辑将对其进行更改。

这些规则对于每个企业都是唯一的,因此它不是一个适合所有解决方案的规模。 在现实世界中,规则引擎或类似的工具将是理想的选择,因为它将在定义和管理这些规则时提供更多的灵活性。 但是,对于我的基本R&D需求,此硬编码解决方案很好,并且充分展示了提供业务逻辑层的好处,因为您可以将业务逻辑“关注点”与消息和数据库处理逻辑分开 。

一种数据模型可以全部统治。

所有这些层都有一个共同点,那就是它们管理的数据(aka Entity)对象。 产品实体由XML表示,由XSD描述并由WSDL引用。 这些定义被JAX-WS转换为Java对象,并且这些相同的Java对象在整个代码中本机使用,从而避免了任何数据模型转换 。

这种技术被称为“避免转换”,是这种基于NoSQL的实体服务开发技术的特殊样式的主要优点之一。

避免转换是一种最佳实践,可以提高服务的可重用性和可组合性– soapatterns.org。

实质上,通过此服务开发,我设法在每个层中使用了这些相同的Java数据对象,但仍保持了真正的合同优先的开发方法。 对于开发人员而言,这确实是个好消息。 我还避免了对数据模型转换层的需求,当消息和数据库之间的数据模型不兼容时(对于ESB销售人员而言,这是个坏消息),这常常就变得很必要。

使用NoSQL还使我完全避免了对表和数据关系使用任何SQL DDL,并且不需要任何复杂的对象映射,例如处理传统ORM所需的那些映射。 我什至可以随时间推移变形我的数据模型,而不会经常破坏东西(非常适合服务版本控制)。

关于保持JEE简单的注意事项。

为了减少与JEE相关的部署和配置麻烦,我使用了新的部署和打包机制,该机制使您可以在同一应用程序WAR文件中定位EJB和Web应用程序。 这使使用JEE功能变得轻而易举,并大大简化了Maven的构建,因为我仅使用一个项目和零个部署描述符(甚至缺少web.xml!)。

使用EJB 3.1的JEE从未如此简单,因为它现在基于使用一些非常简单的Java注释。 例如,指定无状态EJB可以是那么简单,因为添加@Stateless注释的一类。 这样做是在告诉应用程序服务器将类部署到池中,以使其具有高可用性,并将对方法的调用包装在事务中。 作为无状态Bean,它将没有会话的概念,并且不会在调用之间保持任何状态(对于无状态服务而言是理想的)。

@Stateless
public class ProductsManager

为了从应用程序的另一部分(例如,从@WebService类)使用此bean,您只需添加正确类类型的引用变量,然后使用@EJB注释对该变量进行注释。 这告诉应用程序服务器在运行时使用一种称为依赖项注入的机制从预填充的bean池中“注入”正确类型的实例。

@WebService(...)
public class ProductsEntityService implements Products {@EJBprivate ProductsManager bean;...

其他有用的JEE功能。

消息驱动的Bean非常适用于实现事件驱动的消息传递 ,其中消息生产者和使用者之间需要持久和异步通信。 但是,我可能不会将它们用于特定的R&D工作,因为我的需求是用例太弱而无法证明工作的合理性(我将向谁通知新产品?)。 此外, @ MessageDriven bean批注使此功能非常易于使用,并且它是基于JMS的完善且高度可靠的功能。

EJB 3.1还允许使用许多新的有用的bean类型。 单例bean是由服务器管理的单例类,并使用@Singleton批注指定(如果需要为群集单例之类的事情,这很方便)。 @Schedule批注可用于根据日程安排(例如,每个星期五中午)生成常规事件,这些时间可以方便地进行报告等。

摘要

因此,我现在拥有一个可以正常工作的n层Web服务,该服务能够使用NoSQL数据库来持久化,管理和检索Product实体。 下次,我将介绍使用这些技术实现更多SOA模式的方法。 订阅我的博客以在发生这种情况时得到通知。

继续第5部分 。

参考: 使用NoSQL实施实体服务–第4部分:我们的JCG合作伙伴 Ben Wilcock的Java EE ,位于SOA,BPM,Agile和Java博客上。


翻译自: https://www.javacodegeeks.com/2012/09/implementing-entity-services-using_389.html

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

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

相关文章

yii2之DetailView小部件

DetailView小部件用于展示单条数据记录&#xff0c;可配置属性很少&#xff0c;使用也很简单&#xff0c;直接贴代码&#xff0c;一看就懂&#xff01; yii小部件数据小部件DetailView的使用示例&#xff1a; <? DetailView::widget([model > $user,//模型对象&#xff…

克隆安装oracle,Oracle 之 Cloning $oracle_home (克隆安装oracle软件)

用途&#xff1a;Cloning an Oracle Home &#xff0c; 可以免去多台机器重复安装oracle软件1、停止相关进程[rootnode1 bin]# ./crsctl stop cluster -all2、打包 dbhome_1 目录[rootnode1 11.2.0]# cd /u01/app/oracle/product/11.2.0/[rootnode1 11.2.0]# tar -zcvpf db_1.b…

gitlab的安装和基本维护

基本介绍 GitLab是一个自托管的Git项目仓库&#xff0c;可以自己搭建个人代码管理的仓库&#xff0c;功能与github类似。 安装 操作系统&#xff1a;CentOS6.5 gitlab官网下载安装地址&#xff1a;https://about.gitlab.com/downloads/#centos6 1.安装依赖的包 yum install cur…

Spring配置文件和Java配置

我的上一个博客介绍了Spring 3.1的配置文件&#xff0c;并解释了使用它们的业务案例&#xff0c;并演示了它们在Spring XML配置文件中的用法。 但是&#xff0c;似乎很多开发人员更喜欢使用Spring的基于Java的应用程序配置&#xff0c;因此Spring设计了一种使用带有现有Configu…

php 删除单个文件大小,php删除指定大小的jpg文件

function actionZmdel(){//set_time_limit(0);$dir dirname(dirname(dirname(dirname(__FILE__))))./2012jxgwyimg;$dirarr scandir($dir);echo 正在删除...;foreach($dirarr as $subdir){if($subdir ! . && $subdir ! ..){$path $dir./.$subdir;$files glob($path…

2017寒假零基础学习Python系列之函数之 函数之定义可变参数

若想让函数接受任意个参数&#xff0c;就可以定义一个可变的参数&#xff1a; def fn(*args): print args fn() >>>() fn(1,2,5,6) >>>(1,2,5,6) 原理是Python解释器把传入的一组参数封装在一个tuple传递给可变参数&#xff0c;因此在函数内部&#xff0c;直…

在Windows上构建OpenJDK

通过做一些实验&#xff0c;我发现手头提供JDK源代码来进行一些更改&#xff0c;使用它等等通常很有用。因此&#xff0c;我决定下载并编译该野兽。 显然&#xff0c;这花了我一些时间&#xff0c;尽管我最初的想法是&#xff0c;它应该和运行make命令一样简单&#xff1a;&…

unity中怎么在InspectorI面板加LOGO

转载于:https://www.cnblogs.com/unitySPK/p/7278925.html

oracle stream 主键,oracle stream配置向导

1. Stream 的工作原理Stream 是Oracle Advanced Queue技术的一种扩展应用&#xff0c;这种技术最基本的原理就是收集事件&#xff0c;把时间保存在队列中&#xff0c;然后把这些事件发布给不同的订阅者。从DBA的角度来说&#xff0c;就是把捕获Oracle数据库产生的Redo日志&…

JavaScriptDOM 十四. Event DOM的属性

1 <!DOCTYPE html>2 <html>3 <head>4 <title></title>5 <script type"text/javascript">6 7 /*8 1. --------------- Event DOM 事件DOM 用户交互 ------------------9 当事件发生时, 执行JS功能代码10 11 常用…

五、创建Bean的三种方式

五、创建Bean的三种方式转载于:https://www.cnblogs.com/ljiwej/p/7280614.html

重写到边缘–充分利用它! 在GlassFish上!

现代应用程序开发的一个重要主题是重写。 自从Java Server Faces引入和Java EE 6中新的轻量级编程模型以来&#xff0c;您一直在努力使用漂亮&#xff0c;简单&#xff0c;可添加书签的URL。 PrettyFaces很久以来就一直存在&#xff0c;即使它在3.3.3版本中可以说是成熟的&…

php yii框架路由,yii框架路由配置

首先要在服务器配置(httpd.conf)中开启重写模块#开启重写模块&#xff0c;将其前面的#去掉LoadModule rewrite_module modules/mod_rewrite.so#Directory中允许覆盖开启## Possible values for the Options directive are "None", "All",# or any combinat…

前端面试总结二

一、响应式和自适应的区别&#xff1a; 联系(相同点)&#xff1a; 响应式设计(responsive design)和自适应设计(adaptive design)都是用来解决网页在不同分辨率的屏幕和设备上展示的一项技术(或者说一种方法)。 区别&#xff1a; 响应式设计&#xff1a;通过CSS Media Queries(…

“Spring入门”教程系列

大家好&#xff0c; 我很高兴向您介绍“Spring入门”教程系列&#xff01; 这是一系列文章&#xff0c;最初由我们的JCG合作伙伴 Michal Vrtiak在vrtoonjava博客上撰写 。 本系列中将逐步创建一个时间表管理应用程序&#xff0c;并且每个教程都在前一个教程的基础上构建。 处…

【看番杂感】Clannad系列观后感(剧透慎入)

前言 之前看第一季时&#xff0c;弹幕里总有人在刷“写作cl&#xff0c;读作人生”。当时我想&#xff0c;盲目把一部催泪番上升到人生的高度&#xff0c;这未免有些武断&#xff0c;也是对作品本身的不尊重。当看完第二季的我蓦然回首&#xff0c;发现这才是最最贴切的评价&am…

oracle+tns+01106,TNS-01106:Listener using listener name already been started

最近在做HACMP双机互备切换测试的时候&#xff0c;发现一个问题&#xff1a;A节点的listener端口为1521 &#xff0c;B节点的listener端口为1522&#xff0c;为什么两个节点的监听要用不同的端口号&#xff1f;当时AB机使用不同端口是基于如下考虑&#xff1a;HACMP的切换数据库…

Centos7 开机显示 ERST: Failed to get Error Log Address Range” 导致无法开机解决方法

开机显示 ERST: Failed to get Error Log Address Range” 导致无法开机&#xff0c;也无法重新安装系统&#xff0c;解决方法&#xff1a;开机进入BIOS &#xff0c; 关闭ACPI选项即可正常开机 转载于:https://www.cnblogs.com/zhangjianghua/p/6376811.html

Spring MVC 3模板和Apache Tiles

对于任何Web应用程序而言&#xff0c;有效的设计考虑因素是使用模板引擎&#xff08;或工具&#xff09;&#xff0c;并且由于具有Spring的“可插拔”特性&#xff0c;因此集成模板机制&#xff08;例如Apache Tiles&#xff09;的确要容易得多。 在这篇简单的文章中&#xff0…

hihocoder1543 SCI表示法

题意&#xff1a;任何一个数可以表示为连续整数相加&#xff0c;问这些连续整数的最大长度 题解&#xff1a;假设左右是l,r,那么(lr)*(l-r1)/2就是这段序列的和&#xff0c;枚举2n的所有因子&#xff0c;找到最大的就可以了 我的做法是预处理前缀和&#xff0c;二分找到答案位置…