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

java nosql

现在,我已经准备好了一个框架式的合同优先型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实体的持久性和检索。

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

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

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

在我的业务逻辑层中,我的产品管理器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

java nosql

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

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

相关文章

iOS安装CocoaPods的详细步骤

之前的文章没有说明如何安装CocoaPods,现在向大家一一说明: 1.升级ruby环境 应该输入:$ sudo gem update --system sudo是强制升级 2.更换ruby镜像 首先先移除现有ruby镜像:终端输入:$ gem sources --remove https://r…

i7怎么老是显示无服务器,i7处理器真有这么差?网友:懂电脑的人都不买!

大家都知道i7处理器的性能非常强劲,但是很多人买电脑时却选择i5或者AMD的,这是为什么?仅仅是价格原因么?可是为什么即使是预算足够,那些懂电脑的人也不会去选择I7处理器,难道名声在外的i7处理器真有这么差&…

JQuery入门

jQuery基础语法 $(selector).action() 查找标签 选择器 id选择器: $("#id") 标签选择器: $("tagName") class选择器: $(".className") 配合使用: $("div.c1") // 找到有c1 class类的div…

Java应用程序的令牌认证

建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现。 注册 ,再也不会建立auth了! 2016年5月12日更新:构建…

mac 远程ftp服务器文件共享,mac 远程ftp服务器文件

mac 远程ftp服务器文件 内容精选换一换云堡垒机配置了FTP/SFTP远程备份,报请检查服务器密码或网络连接情况错误,不能启动远程备份。选择备份具体某一天日志,提示备份正在执行,但远程服务器未接收到该备份文件。原因一:…

ConcurrentHashMap 源码分析

https://weibo.com/6515091862/G9DawzK9fhttps://weibo.com/6515091862/G9D6x1kQrhttps://weibo.com/6515091862/G9Bo8oRCp 1. 前言 终于到这个类了,其实在前面很过很多次这个类,因为这个类代码量比较大,并且涉及到并发的问题,还有…

lambda ::_Lambda项目:迈向多核及超越

lambda ::周一下午在JavaOne 2011的希尔顿旧金山大宴会厅B上做了“ Project Lambda:迈向多核和超越”(会议27400,不要与Brian Goetz的同名演讲相混淆) 的演示 。大宴会厅关闭,这是一个非常大型的非主题演讲场地&#x…

Java 8:默认方法解析规则

随着Java 8中默认方法的引入,一个类现在可以从多个位置(例如另一个类或接口)继承相同的方法。 在这种情况下,可以使用以下规则来确定选择哪种方法: 类或超类方法声明始终优先于默认方法 否则,将使用具有最…

Log4j 2使用教程二 【详解】

配置Log4j 2的配置可以通过4种方式中的1种完成:1、通过使用XML,JSON,YAML或属性格式编写的配置文件。 2、以编程方式,通过创建一个ConfigurationFactory和配置实现。 3、以编程方式,通过调用配置界面中公开的API将组件…

firstJava

import java.util.Date;/*** Created by Administrator on 2018/3/30.*/ public class Test {public static void main(String[] args) {System.out.println("强调自主练习");new Date();} } 转载于:https://www.cnblogs.com/fengdaren/p/8675148.html

将Java EE Monolith雕刻成微服务

在介绍了为什么微服务应该由事件驱动的简介博客之后,我想采取一些其他步骤,并在有关博客的同时准备我即将进行的一系列演讲(请参阅jBCNconf和Red Hat Summit,旧金山 )。 在Twitter christianposta上关注我,…

【终结版】C#常用函数和方法集汇总

C#里面的常用的函数和方法非常重要,然而做题的时候会经常忘记这些封装好的方法,所以我总结一下 C#常用函数和方法集。 【1】C#操作字符串的常用使用方法 在 C# 中,您可以使用字符数组来表示字符串,但是,更常见的做法是…

hadoop hdfs (java api)

简单介绍使用java控制hdfs文件系统 一、注意namenode端访问权限&#xff0c;修改hdfs-site.xml文件或修改文件目录权限 本次采用修改hdfs-site.xml用于测试&#xff0c;在configuration节点中添加如下内容 <property><name>dfs.permissions.enabled</name>&l…

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

glassfish现代应用程序开发的一个重要主题是重写。 自从Java Server Faces引入和Java EE 6中新的轻量级编程模型以来&#xff0c;您一直在努力使用漂亮&#xff0c;简单&#xff0c;可添加书签的URL。 PrettyFaces已有一段时间了&#xff0c;即使我可以说服它在3.3.3版本中被称…

BZOJ 4557 JLOI2016 侦查守卫 树形dp

题目链接&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id4557 题意概述&#xff1a; 给出一棵树&#xff0c;每个点付出代价w[i]可以控制距离和它不超过d的点&#xff0c;现在给出一些点&#xff0c;问控制这些点的最小代价是多少。 分析: 观察一下数据范围发现…

Java6上开发WebService

Java6上开发WebService 2010-01-23 16:19:00 标签&#xff1a;Java6 WebService 休闲 职场 版权声明&#xff1a;原创作品&#xff0c;如需转载&#xff0c;请与作者联系。否则将追究法律责任。 近日朋友问起Java开发WebService的问题&#xff0c;于是为其写了一份简单说明&…

在spring中该如何使用DTO,以及DTO和Entity的关系

1. DTO是用于将后台的数据结构&#xff08;javaBean&#xff09;转换为对用户友好的表现方式的数据结构&#xff0c;同时也能防止后台数据直接传送到前台而存在的潜在危险。 2. 可以时候要哪个springbot框架提供的转换器接口&#xff1a; org.springframework.core.convert.con…

带有Kafka和ZeroMQ的分布式类星体演员

因此&#xff0c;您已经有了使用actor的精美设计&#xff0c;选择了JVM和Quasar在该主题上的强大而忠实的观点。 所有明智的决定&#xff0c;但是在集群上进行分配时您有什么选择呢&#xff1f; 星系 Galaxy是一个非常酷的选择&#xff1a;快速的内存中数据网格&#xff0c;针…

JAVA中断线程的方法

JAVA中断线程的方法 Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃&#xff0c;使用它们是极端不安全的&#xff01; 现在&#xff0c;如果你要安全有效地终止一个线程&#xff0c;应该采用以下这些方法&a…

最常见的Java异常及其对Java开发人员的评价

我知道我说在完成视频之前我不会张贴帖子&#xff0c;但这一直困扰着我。 至于视频的更新&#xff0c;我有些懒散&#xff0c;有些忙碌&#xff0c;但是我已经准备好记录第一集&#xff0c;这是我第一次有机会&#xff0c;而且我不需要太多的编辑。 无论如何&#xff0c;还是今…