当前位置: 首页 > 知识库问答 >
问题:

启动后台任务的同步 Jersey Rest 服务?

蒙经纶
2023-03-14

这是我遇到的问题,与设计和实现相关:

我有一个接受 POST 请求的 REST Web 服务。没什么特别的。它当前以同步方式响应。

但是,此web服务将启动一个后台进程,这可能需要很长时间。

我不希望此服务在 30 分钟后响应。

相反,它应该立即向客户端返回一个ack响应,仅此而已(即使在30分钟后,也不会有更多的信息要发送)。

我如何在泽西实施这种行为?

我读了那一页https://jersey.java.net/nonav/documentation/2.0/async.html#d0e6914.

虽然这是一个有趣的阅读,但我没有找到只发送ACK类型响应(类似于HTTP 200代码)的方法。

也许我对异步和我想要实现的行为感到困惑。

我只是知道我可以在@POST方法中创建一个新的Thread来处理后台进程,并立即返回确认字符响应。

但是,在响应被发送回客户机之后,这个新线程还活着吗?

您将如何实现这个WS?

我希望你能帮我澄清这一点。

共有1个答案

燕野
2023-03-14

我认为您链接的Jersey 2异步服务器API仍然会保持客户端连接,直到处理完成。异步处理实际上是Jersey内部的,不影响客户端体验。

如果要返回 ACK,可以使用常规的 Jersey 方法,将工作委派给另一个线程,然后立即返回。对于此用例,我建议使用 HTTP 202。

您可以创建一个线程来这样做,就像在Jersey 2示例中一样,它将在Jersey资源方法调用的执行过程中继续存在:

@POST
public Response asyncPost(String data) {
    new Thread(...).start();
    return Response.status(Response.Status.ACCEPTED).build();
}

话虽如此,通常不建议在应用程序服务器中创建线程。

如果你用的是EE7,我建议你看看JSR-236 http://docs . Oracle . com/javaee/7/API/javax/enterprise/concurrent/package-summary . html

如果您使用的是EE6,可以考虑将消息发送到队列,由消息驱动bean(MDB)在后台处理。

 类似资料:
  • 问题内容: 我有一个flask应用程序,目前正在以以下方式启动: 当我运行此脚本时,它通过打印成功执行: 但是它永远不会返回,如果我执行CTRL-C,服务器将停止。我正在尝试将其部署到生产环境中,并希望在后台运行此启动,只要服务器启动,进程就可以启动。 做这个的最好方式是什么? 问题答案: 可能是使其在后台运行的最简单方法。就是说,如果你要将其转入生产环境(如@LukasGraf所提到的那样,则不

  • windows phone 8.1应用程序中的计时器后台任务仅在应用程序从visual Studio以调试模式运行时激发。但是,如果我在没有调试的情况下启动debug binary,它就不能工作,15分钟后,几个小时后都不能工作。我在windows Phone8.1模拟器和nokia Lumia920上测试了它--同样的结果:在调试会话中它可以工作(它由系统触发,我可以从调试位置工具栏手动触发),

  • 你能告诉我在Android中做同步工作的正确方法是什么吗(例如,如果我有大约5个工作)<注意 我所说的同步作业是指在后台运行并通过Web服务发送一些数据(如分析)的线程。。。 有关更多详细信息,请阅读更详细的描述: 我的任务是实现一些后台作业,这些作业将使一些数据与restful web服务同步。一些作业应定期安排,并有特定的延迟。如果没有internet连接,我只需缓存数据,然后当连接再次出现时

  • 问题内容: 我有一个Django网站,并且一个页面上有一个按钮(或链接),单击该按钮将启动一个运行时间较长的任务。显然,我想将此任务作为后台任务启动,并立即将结果返回给用户。我想使用一种简单的方法来实现此目的,该方法不需要我安装和学习例如Celery这样的全新消息传递体系结构。我不想用celery!我只想使用一种简单的方法,就可以在接下来的半小时左右的时间内进行设置并开始运行。在Django中没有

  • 说明 在后台任务中,因为是运行在task进程,所以无法使用协程和协程客户端。如果你要操作数据库或Redis,一定要配置同步的连接池。 配置 项目配置文件中mainServer.configs.task_worker_num一定要配置为大于0,否则无法使用后台任务。 定义任务执行类 <?php namespace Test; use Imi\Task\TaskParam; use Imi\Task

  • 所以我正在使用asmack库来侦听传入的xmpp数据包。我已经实现了服务。它启动,绑定,运行一个方法,然后解除绑定。该服务创建PacketListener以获取传入消息,并在新消息传入时显示通知。当应用程序处于活动状态时,这一切都起作用,但当它完全关闭(在窗口列表中滑动)时就不起作用了,它只是在运行服务,PacketListener不启动。但只要重新打开应用程序,它就会立即启动,关闭所有通知。我正