我的同事告诉我使用本地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。