Java 如何构建耗时的web服务

Java 如何构建耗时的web服务,java,web-services,Java,Web Services,一个简单的理论问题,答案可能是一个,但我想听听一些意见和建议。我需要实现一个web服务(java),它将启动一个耗时的过程,该过程将解析一些输入文件并对DomeDB人员进行操作 让用户知道整个过程不仅开始了,而且结束了(解析、更新数据库……)的最佳方法是什么?因为我不能让用户等待整个过程完成 注意:用户在启动进程之前经过身份验证 编辑:web服务不仅可以通过web浏览器访问,而且客户机可以通过使用他们想要的语言构建的任何客户机访问它,只要他们引用wsdl 谢谢当用户提交数据时,我会给他们一个令牌

一个简单的理论问题,答案可能是一个,但我想听听一些意见和建议。我需要实现一个web服务(java),它将启动一个耗时的过程,该过程将解析一些输入文件并对DomeDB人员进行操作

让用户知道整个过程不仅开始了,而且结束了(解析、更新数据库……)的最佳方法是什么?因为我不能让用户等待整个过程完成

注意:用户在启动进程之前经过身份验证

编辑:web服务不仅可以通过web浏览器访问,而且客户机可以通过使用他们想要的语言构建的任何客户机访问它,只要他们引用wsdl


谢谢

当用户提交数据时,我会给他们一个令牌,并让他们使用令牌(异步)轮询到另一个方法

然后,在第1种方法中,我将把数据添加到一个队列中,让服务器上运行的另一个进程检查该队列并执行处理。然后更新数据库中的令牌以通知用户他们的作业已完成


我以前做过类似的工作,发现在基于HTTP/web的系统上启动一个长时间运行的进程是个坏主意,因为底层系统经常会超时对长时间运行的web服务的调用。

对于您的场景,您应该实现异步web服务。对于异步web服务,您有两种选择

  • (正如有人已经提到的)您可以对服务进行轮询,以查看流程是否完成
  • 您可以要求服务器回调
  • 第一种方法易于实现,可以与许多WS-Library一起使用。然而,这带来了一个缺点,即服务器必须为客户端的轮询请求浪费带宽。毕竟,这是投票。大多数时候,投票是个坏主意

    后者的实现不如前者简单。我不知道是否每个JAX-WS库都支持它。为了支持你,我在谷歌上快速搜索并找到了这个链接


    这可能会对您有所帮助。

    完成后向他们发送一封电子邮件。您提到您不能让用户等待,所以我们可以假设您正在使用单独的线程进行解析、数据库等工作吗?目前web服务正处于设计阶段。没有编写任何代码。所以任何建议都是受欢迎的。我不想让用户在浏览器窗口打开的情况下等待,直到web服务完成。当你说你不想让用户在浏览器窗口打开的情况下等待时,你是否真的希望他能够关闭浏览器窗口(或他正在使用的任何客户端)并仍然得到通知?那么电子邮件可能是唯一剩下的选项…可能是+1的副本;你为什么说“诱惑”?“这种方法的阴暗面是什么?”奇科多罗·斯佩奇说,但你是对的。这是我做这件事的唯一方法!上个月我一直在做同样的事情+1+1表示回拨。我绝对推荐回调设计,而不是轮询。当然,这只在客户端能够侦听回调时才起作用,例如,如果客户端是web应用程序。若您正在实现回调,那个么客户端应该包括回调细节,比如URL。