java - Web服务中的Java在达到阈值时间后返回响应并在此之后继续执行
问题描述
在 Web 服务中的 Java 中,我有一个要求,我想在配置的阈值时间达到后将响应返回给用户,并希望在此之后继续处理。
假设我有一个服务,它执行第 1 步、第 2 步,并且配置的阈值为 1 秒。假设 step1 在 1 秒完成,我想向用户返回确认响应并继续使用 step2 处理,并希望将响应存储在 DB 或类似的东西中。
如果有人对此问题有任何解决方案或想法,请告诉我
解决方案
有多种方法可以实现这一目标
HTTP 层
在 HTTP 层上,如果响应在阈值之前返回,那么我很想发回一个200 Success
.
但是,如果花费的时间超过阈值,您可以使用202 Accepted
查看RFC,它的用例看起来像这样
6.3.3. 202 接受
202(Accepted)状态码表示请求已被接受处理,但处理尚未完成。该请求最终可能会或可能不会被执行,因为在实际进行处理时它可能会被禁止。HTTP 中没有用于从异步操作重新发送状态代码的工具。
202 响应是故意不置可否的。它的目的是允许服务器接受对其他进程的请求(可能是一个每天只运行一次的面向批处理的进程),而不需要用户代理与服务器的连接持续到进程完成。与此响应一起发送的表示应该描述请求的当前状态并指向(或嵌入)一个状态监视器,该监视器可以为用户提供对何时完成请求的估计。
现在,当然,您可以每次都返回,而不是混合使用200
and202
202
应用层
在您的应用程序层中,您通常希望为此目的使用异步处理。
有多种方法可以利用这种工作方式,您可以:
- 在队列/主题上发布消息并让消息代理负责将其分派到应用程序的另一部分或另一个应用程序并让这部分进行处理
- 将请求保存在数据库中,并让另一个服务轮询数据库以获取新请求,类似于上面解释的排队,无需 JMS
- 如果您使用的是 Java EE,则您的 EJB 容器允许您使用
@Asynchronous
它将异步调用方法并返回(因此您将能够返回202
) - 如果您使用的是 Spring,它具有与
@Async
上述相同目的的注释
您肯定可以使用其他方法来实现此用例,但我认为我介绍的方法是最常见的方法
推荐阅读
- docker - 运行shinyProxy中包含的应用程序时在本地访问文件
- javascript - 如何使我的分屏响应?
- apache-spark - 如何使用 saveAsNewAPIHadoopFile spark scala 将文件保存在同一目录中
- ngx-graph - 如何添加 ngx-graph 自定义布局
- html - 如何在同一行对齐材质图标和标题文本?
- angular - Angular 7:NullInjectorError:MatSnackBarConfig 没有提供者
- jpa - 如何将 PersitenceProvider 实现到 Tapestry 项目的运行时环境中?
- delphi - 是否可以在不复制像素的情况下将 TBitmap32 转换为 TBitmap?
- json - 如何将参数传递给 Azure Logic Apps Liquid Connector 以进行 JSON-JSON 转换?
- excel - Excel:仅对具有特定标签的值求和