0

EJB 规范说你不应该管理线程。我已经看到 Bean 代码发送远程请求并使用 Thread.sleep 循环等待响应以减少 CPU 使用率。据我了解,这违反了规范。简单地从一个单独的 POJO 或库中调用逻辑,然后在 EJB 的方法中引用它来解决这个问题吗?简单地删除 Thread.sleep 是否会以额外的 CPU 消耗为代价来解决问题?外部同步请求应该如何在 EJB 中编码?

4

1 回答 1

0

这取决于商业案例。EJB 规范为异步/同步处理提供了大量资源,而无需使用样板代码ThreadRunnable任何其他机制。

要异步执行一段或代码(即调用者不会等待响应,而是继续执行),请使用@AsynchronousFuture<T>如果您想在后面听响应。

正如您所说,同步调用是等待响应的调用,因此“外部同步请求应该如何在 EJB 中编码”是不需要任何类型的异步/后台执行的东西。您只需进行调用,代码本身就会等待响应(否则它将是异步的),这是 Web 服务(REST 或 SOAP)的典型情况。

Web 服务调用实际上可以是同步的或异步的,这取决于业务案例,但它们通常是同步的,您进行调用并接收带有数据的响应。在需要一段时间执行的业务逻辑的情况下,Web Service 接收请求并可能异步启动业务逻辑(@Asynchronous例如)并立即使用纯 HTTP 响应202 - Accepted,这基本上意味着“嘿!您刚刚发送的请求我要花点时间,所以我会在后台做”。

在这种情况下,您可能需要检查另一个 Web 服务,以了解该长期过程的进展情况。这是我能想到的唯一一种情况,在这种情况下,有人会希望Thread.sleep(...)循环使用它,检查 Web 服务,直到它告诉您该过程已经完成。

幸运的是,EJB 还为该业务案例提供了解决方案:

  1. @Schedule如果您需要在特定的时间间隔内检查/做某事,您可以使用一些方法:每天 02:00,或每月的第一天,甚至每 2 秒要做的事情。
  2. 或者TimerService@Timeout如果您想以编程方式安排单个任务。最后一个更适合我们正在讨论的商业案例。

因此,您TimerService使用要等待下一次检查的时间跨度调用 。当时间到来时,该@Timeout方法被触发,您可以在其中检查您需要的任何内容,并在需要时安排另一个执行,即使使用新的时间跨度也是如此。

于 2022-01-17T20:36:40.063 回答