现在,我已经准备好了框架式的合同优先型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

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

  1. nosql怎么使用_使用NoSQL实施实体服务–第5部分:使用云提高自治性

    nosql怎么使用 在之前的文章中,我讨论了如何通过结合使用Java Web Services , Java EE和CouchDB NoSQL数据库为产品构建SOA"实体"服务. ...

  2. nosql的数据服务_使用NoSQL实现实体服务–第1部分:概述

    nosql的数据服务 在过去的几周中,我一直在进行一些研发工作,以了解使用NoSQL数据库实现实体服务 (也称为数据服务)的优势. 实体服务是Thomas Erl的<服务技术>丛书中提出的 ...

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

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

  4. nosql的数据服务_使用NoSQL实现实体服务–第3部分:CouchDB

    nosql的数据服务 在本系列的第2部分中 ,我使用SOA的"合同优先"技术创建和部署了产品实体服务,现在,我将致力于服务实现的NoSQL数据库方面. 正如我在第1部分中已经提到的 ...

  5. nosql的数据服务_使用NoSQL实现实体服务–第2部分:合同优先

    nosql的数据服务 现在该开始使用NoSQL项目对SOA实体服务进行编码了,并且正如我所承诺的,我将从Web服务的合同开始. 看一下本系列的第1部分 . 这种从Web服务合同定义开始的技术是面向服务 ...

  6. 使用NoSQL实施实体服务–第5部分:使用云提高自治性

    在先前的文章中,我讨论了如何通过结合使用Java Web Services , Java EE和CouchDB NoSQL数据库为产品构建SOA"实体"服务. 在本系列的最后一篇文 ...

  7. 使用NoSQL实现实体服务–第1部分:概述

    在过去的几周中,我一直在进行一些研发工作,以了解使用NoSQL数据库实现实体服务 (也称为数据服务)的优势. 实体服务是托马斯·埃尔(Thomas Erl)的<服务技术>丛书中提出的服务分 ...

  8. 使用NoSQL实现实体服务–第2部分:合同优先

    现在该开始使用NoSQL项目对SOA实体服务进行编码了,并且正如我所承诺的,我将从Web服务的合同开始. 看一下本系列的第1部分 . 这种从Web服务合同定义开始的技术是面向服务的体系结构实现的&qu ...

  9. 使用NoSQL实现实体服务–第3部分:CouchDB

    在本系列的第2部分中 ,我使用SOA的"合同优先"技术创建和部署了产品实体服务,现在,我将致力于服务实现的NoSQL数据库方面. 正如我在第1部分中已经提到的那样,我已经选择Cou ...

最新文章

  1. java中事件监听_Java中的事件监听机制
  2. 人工智能的恶意用途:预测、预防和缓解
  3. 构建一个业务连续的网络
  4. Linux命令:MySQL系列之五--SELECT单表查询、多表查询升级及删除,插入
  5. [YTU]_2633( P3 数钱是件愉快的事)
  6. LeetCode-有效的字母异位词
  7. 11、mybatis的功能架构分析
  8. SharePoint 2013异常信息的查看
  9. 手机电子词典_网易有道入局,「智能化」能拯救电子词典这个「老古董」吗?...
  10. linux自定义model,关于modelarts自定义镜像使用心得
  11. 聊聊hikari与tomcat jdbc pool的fail fast
  12. JDBC Driver
  13. Android:更好的自定义字体方案
  14. MyBatis单表增删改查--接口实现
  15. Error of Git
  16. 《线性代数》(同济版)——教科书中的耻辱柱
  17. “离职同事在工作群抢红包被踢”:学会退群,是职场人的基本修养
  18. 2019 Multi-University Training Contest 3:Yukikaze and Demons(点分治 + exgcd)
  19. windows10更新服务器修改,Windows 10彻底关闭自动更新(Windows Update和Windows Update Medic Service)...
  20. python四叶玫瑰数,任意位数自幂数寻找|Python练习系列[4]

热门文章

  1. jvm的client与server工作模式
  2. JSON | JSON字符串和JSON对象的区别
  3. tomat(16)关闭钩子
  4. 使用vo注释做一个poi导出功能
  5. 混合多云架构_使用混合多云每个人都应避免的3个陷阱(第4部分)
  6. lombok 简化代码_如何编写更少,更好的代码,或Project Lombok
  7. api网关和esb区别_具有ESB,API管理和Now .. Service Mesh的应用程序网络功能。
  8. hibernate查询缓存_在Hibernate中启用实体和查询缓存
  9. javafx_JavaFX技巧4:总结
  10. java整数的因式分解_如何在Java中找到整数的质数-因式分解