何时应该优先选择EJB而不是GWT Servlet

5

我的同事告诉我,使用本地EJB不是一个好主意,因为它们充当打包在JAR中的类(即当EJB仅用作local时,它们与普通类没有任何优势)。只有在一些代码可能被多个应用程序使用时,我才必须使用EJB。但是我读过更多关于EJB的优点(安全性、线程安全、事务等)。

所以我很困惑:什么时候使用GWT Servlet(它比简单的HTTPServlet更方便,它提供了RPC风格的方法调用),什么时候使用EJB?

附言:我不使用任何像JPA 2.0、CDI等未来技术(因为我只能在WAS 7上使用Java EE 5)。


这可能会有所帮助:https://dev59.com/e3I-5IYBdhLWcg3wHUZB。 - betomontejo
3个回答

9
我的同事告诉我使用本地EJB不是一个好主意,但我强烈反对这种说法。本地EJB是实现业务逻辑的完美bean类型,非常适合使用。当前的EJB bean非常轻量级,因此您不必因为它们被指责为重型而避免使用它们。这些类型的bean最大的优点可能是它们的自动事务管理,在进行任何数据库工作时非常有用。
这不仅仅是企业应用程序需要访问JMS队列和复杂的EIS系统。任何进行多次写入数据库的Web应用程序都会从中受益。没有事务,当出现异常或崩溃时,您将得到一个只有部分保存在数据库中的“User”。而且如果没有EJB,您将不得不在代码中添加大量冗长的“start\commit\rollback”语句,更不用说将您的事务(通常通过“Connection”)传播到所有代码中,并具有事务处于活动状态和非活动状态的不同情况。
使用EJB bean,所有这些复杂性都消失了。这就像垃圾收集与手动内存管理之间的区别。
即使是最简单的Web应用程序也可以利用其他有趣的功能,例如声明式角色检查(@RolesAllowed),bean池(以限制吞吐量等)和线程安全。
在Java EE 6中,它们变得更易于用于简单的Web应用程序,在那里它们可以出现在.war的任何位置(不再需要单独的.jar和伞形.ear)。
所以我很困惑:什么时候使用GWT Servlet(它比简单的HTTPServlet更方便,它提供了RPC样式的方法调用),什么时候使用EJB?
现在我们谈论远程EJB。在这种情况下,答案是不同的。
如果客户端从互联网连接,您几乎永远不会使用远程EJB。通常需要打开大量端口,包括客户端的端口。
同样,如果您有异构客户端(.NET,C ++,甚至运行稍微不同版本AS的Java客户端),则通常不会使用远程EJB。
尽管理论上支持Corba(IIOP)并因此允许不同类型的客户端,但实际上,只有当客户端和服务器都运行Java并且是相同的AS(应用服务器)或其中一个是具有远程服务器客户端库的Java SE客户端时,远程EJB通信才起作用(这可能是巨大的)。
对于一种远程技术来说有点尴尬,但是EJB规范甚至没有指定如何首先设置远程连接。事实上的标准是远程JNDI,但由于这不是规范,例如JBoss希望停止在JBoss AS 7中支持此功能。
在所有这些情况下,您应该使用Web服务技术而不是远程EJB。 GWT Servlet可能是一个选择,但在这里并不是一个典型的例子。除非您已经在使用GWT,否则我不建议仅为了从任意(非GWT)客户端进行常规Web / RPC连接而安装它。
通用的Java解决方案是JAX-WS和JAX-RS,它们是SOAP resp REST实现(两者都可以与EJB结合使用)。众所周知的JAX-RS实现是Jersey (示例)和RestEasy。在Java EE 6中,您不需要为它们安装任何内容,因为它们已经是平台的一部分。对于Java EE 5,您必须单独安装JAX-RS,但JAX-WS已经存在。
人们通常认为JAX-RS更易于入门,这是一种更现代的方法,尽管JAX-WS具有更多内置的类型安全功能(这也正是它的大部分复杂性来自的地方)。
最后,什么时候我们会使用远程EJB?通常,您将在本地网络上运行相同AS的应用程序之间进行通信时使用此功能。在这种情况下,有潜在的性能优势(二进制序列化可以比json / xml转换更快),并且有一些强大的选项用于传播安全上下文和协调分布式事务。简单的Web应用程序很可能不需要最后一个功能。
经常看到的一种模式是JAX-RS资源(bean)接受来自远程(Web)客户端的请求,然后将工作委托给包含实际业务逻辑的本地EJB。

1

EJB是一种技术,用于后端自己的容器中,并提供了一些功能,如事务安全等,这些对开发人员来说是透明的。

来自Java EE教程:

如果您的应用程序具有以下任何要求,则应考虑使用企业Bean:

应用程序必须具有可扩展性。为了适应越来越多的用户,您可能需要将应用程序的组件分布在多台计算机上。应用程序的企业Bean不仅可以在不同的计算机上运行,而且它们的位置对客户端来说也是透明的。

事务必须确保数据完整性。企业Bean支持事务,这些机制管理共享对象的并发访问。

应用程序将拥有各种客户端。只需几行代码,远程客户端就可以轻松定位企业Bean。这些客户端可以是轻量级、各种各样和众多的。

现在,当您仅在单个Web服务器中进行Web开发时,EJB实际上并不能帮助您,还有其他更简单的选项,例如GWT Servlet。

但是,如果您想使用托管事务,在JMS队列中连接或在后台执行一些批处理,则需要使用EJB。

例如,您收到了一份订单,并且需要与不同的部门进行沟通以完成订单。在这种情况下,您需要一个后台进程来处理工作,同时前端通知客户订单正在准备中。Servlet可以将订单发送到队列中,Message driven bean可以拾取订单并通过调用其他EJB进行一些处理。

0

这取决于您的应用程序/项目需求范围。EJB用于支持Java EE功能。它不包括在您的项目范围内。不要使用它。Java EE Features


Java EE 功能指的是什么?我认为我可以在不使用 EJB 的情况下使用 JPA、REST、SOAP、CDI 等。那么什么时候需要使用 EJB 呢? - WelcomeTo
是的,您可以在不使用EJB的情况下使用它们。但是,您必须手动控制事务(Bean管理事务)。那么Spring怎么样? - Zaw Than oo
离开现在的工作,考虑一下春季怎么样? - WelcomeTo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接