了解 EJB 体系结构和实现

Understanding EJB Architecture and Implementation

我是 Jakarta EE 世界的初学者。 我正在大学学习 Jakarta EE 模块,我正在努力寻找能够正确回答我的问题的信息。 我觉得这是一件非常简单、直接且希望被理解的事情,但我就是不明白。

我的导师不是很有帮助,告诉我不要担心其他任何事情,只是接受“它只是封装的业务逻辑”这是毫无意义和无用的,因为如果仅此而已,那为什么我不能创建我自己的 class.

现在我已经阅读了这篇文章https://docs.oracle.com/cd/E16439_01/doc.1013/e13981/undejbs002.htm,我得到了基本的概述。

我知道以下内容:

  1. EJB 在 EJB 容器中运行,EJB 容器在应用程序服务器中运行,
  2. 两种类型的 EJB:Session Bean,消息驱动 Bean
  3. 三种Session Bean:Stateless、Stateful、Singleton
  4. @Stateless 在 session/method 调用之间不保持“会话状态”?而有状态的 bean 呢?
  5. 容器有这些 EJB(Java classes)的池,基本上在@stateless
  6. 的情况下实例化并随机分配给客户端
  7. @Stateful bean保存在一个pool中,同一个client分配同一个bean?

请随时更正以上任何内容。 据我目前所知,整体架构似乎仍然让我感到困惑,

我有以下6个问题(都已链接)抱歉,如果我没有正确组织它们,我会尝试edit/improve答案:

  1. 非 Java(通用客户端)如何访问 EJB?这可能吗?

据我所知,大多数客户都是以下之一: a) laptop/tablet/mobile 中的 Web 浏览器, b) 本机移动应用程序, c) 一些物联网设备或其他类型的设备(例如交付 driver 保存一些东西到一个独特的手机)等...

现在!假设上面提到的客户(主要是 a 和 b),因为他们最常需要访问相同的“业务逻辑”, 他们将如何处理这件事? 我假设本机移动应用程序也使用 HTTP/s 协议? 这是否意味着它只能通过 Servlet?哪个有点像 MVC 控制器?

根据官方 Java EE 文档中的图表,Web 浏览器似乎无法直接访问 EJB:

  1. 如果 (1) 的答案是否定的,那么 web/mobile 应用程序等客户端不能直接访问 EJB,@Stateful session bean 有什么用吗? 例如在一个网络应用程序中,HTTP 协议是无状态的,可以在 session/cookie 的帮助下维护状态, 这意味着状态由 Web 容器维护?有状态的 session bean 有什么意义?

我已经阅读了有关堆栈溢出的其他问题,这些问题表明将 @stateful session bean 与 Servlet 结合使用并不是一个好主意。

我得到了整个购物车示例,但这并没有解释状态是如何维护的,如果我通过浏览器访问我的购物车,cookie 将负责状态,对吗? EJB 是否可以访问浏览器 cookie?

  1. 如果 EJB 只能被 Java 客户端直接访问:

据我所知 Java 客户示例: 服务小程序, 另一个 EJB 运行 本地或远程, 另一个JavaClass?, 独立 Java 应用程序?

我假设这些客户端会通过 RMI/JNDI/CDI/Dependency 注入访问 EJB(在 servlet 的情况下)? 说 EJB 类似于 Java EE 世界中的 SOAP Web 服务是否公平?

  1. 基于以上所有内容,EJB 是否还有很多用例? 特别是由于大多数应用程序要么通过 Web 要么移动使用 HTTP/Rest 端点,许多应用程序使用 JWT 来管理状态客户端,我看不到许多独立 Java 应用程序的示例,除了 [=92] =] 应用等..

  2. 是否最好使用 MVC/Spring/Spring 引导,它似乎具有更易于理解的体系结构并创建 REST/SOAP Web 服务

  3. RMI 也使用 HTTP 吗? EJB 理解 HTTP 吗?

我认为这些问题大多围绕着同一个问题。我无法得到明确的答案,我认为这应该是显而易见的,但我就是不明白。 任何建议将不胜感激

Jakarta EE 是一堆共存的 API,EJB 只是其中之一。

我们可以说 EJB 是具有方面的普通旧 java 对象。例如:事务管理、安全、监控、池化等

@Stateless 只是在方法调用期间保持状态。 @Stateful 确实在会话期间维护方法调用之间的状态。 @Singelton 确实在 运行 应用程序的整个生命周期中保持状态。

@Stateful beans are kept in a pool and the same client is assigned the same bean?

不,每个客户端都会创建一个新的 bean 实例,并最终将其删除。如果缓存已满,实例可能会钝化到磁盘。

"How do non Java (generic clients) access EJB? Is this even possible?"

通过 Rest 将 JAX-RS 与 EJB 技术集成

@Stateless
@Path("/employee/{id}")
public class Employee {
    public Employee(@PathParam("id") String id) {...}
}

the HTTP/s protocol? Would this mean that it would only be through a Servlet? Which is sort of like an MVC Controller?

JAX-RS och Spring MVC 使用 Servlet。

以 Web 应用程序为例,您可以使用 JSF 或 JSP 与 CDI 集成和 EJB。

If the answer to (1) is no, that clients such as web/mobile apps cant directly access an EJB, is there any use for a @Stateful session bean? Say for example in a web app, HTTP protocol is stateless, state can be maintained with the help of session/cookie, Which would mean the state is maintained by the Web Container? Whats the point of having a stateful session bean?

举个例子:您的购物车和产品在两次通话之间会去哪里? 我们需要将状态保存在某处,您可以使用 @SessionScoped bean 或 @Stateful bean 或数据库等。任何方式都是您的选择

"I have read other questions on stack overflow which suggest its not a good idea to have @Stateful session bean with Servlet."

我不知道它们是什么意思,但是如果您想在购物车中保存您的状态,例如 @Stateful beans 是最佳选择。作为替代方案,您可以将 CDI bean 与 @SessionScoped 一起使用,而不是 EJB @Stateful.

I get the whole shopping cart example, but this does not explain how state is maintained, if I was accessing my shopping cart through a browser, the cookies would be responsible for state right? Does EJB have access to browser cookies?

Jakarta EE 运行时负责这些细节,但如果需要,您可以访问 SecurityContext、SessionContext。

在 EJB 上,您可以使用 @Resource SessionContext ctx; 进行注释以获取调用者的上下文。

Example of Java Clients as far as I know: Servlet, Another EJB running local or remote, Another Java Class?, Standalone Java app?

I assume these clients would access the EJB by RMI/JNDI/CDI/Dependency Injection (in case of servlet)?

不仅仅是 Servlet API,但正如我所说,大多数 Java Web 技术都建立在 Servlet 技术之上或与 Servlet 技术集成。

Would it be fair to say that an EJB is similar to a SOAP Web Service in the Java EE world?

不,对于 SOAP Web 服务,我们使用 JAX-WS,是的,您可以将 JAX-WS 与 EJB 集成

@Stateless
@WebService
public class HelloService {

    public String sayHello(String name) {
        return("Hello "+name +" from first EJB3.0 Web Service");
    }
}

Based on all of the above is there much of a use case for EJB anymore? Especially as most apps are either through the web or mobile using HTTP/Rest end points, many use JWT's to manage state client side, and I cant see many examples of standalone Java apps except for maybe an Android app etc..

EJB 只是 Jakarta EE 的一部分或工具,您必须针对具体情况使用正确的工具。

Is it better to use MVC/Spring/Spring Boot which seems to have a more understandable architecture and create REST/SOAP Web Services

不,你在混合苹果和橙子。 EJB只是一个API,Spring是一个完整的平台。

“虽然有些人认为 Java EE 和 Spring 存在竞争关系,但 Spring 实际上是 Java EE 的补充。”

术语“Spring”在不同的上下文中有不同的含义。它可以用来指代 Spring Framework 项目本身,它是一切的起点。

Spring Boot 是 Spring Framework 的扩展。 Spring Boot 将 Apache Tomcat 作为运行时嵌入。 Apache Tomcat 实现了四个 Jakarta EE 规范——Jakarta Servlet、Jakarta Standard Tag Library、Jakarta WebSocket 和 Jakarta Authentication。 (对于 Undertow,Jetty 几乎是一样的)。

Is RMI also using HTTP?

RMI 协议不再相关,使用 EJB 不需要 RMI。

Does EJB understand HTTP?

如我所说,您可以将 JAX-RS 与 EJB 集成。

如果你有兴趣,我推荐一些在线研讨会

Java EE Bootstrap

Effective Java EE

Java EE Testing

Java EE microservices

Apps With Microprofile