我有一个特别是长的操作,当a时会运行 用户按下界面上的按钮,我想知道什么是最好的 向客户表明这一点的方式。
该操作填充了一个事实表,用于数年的数据 这将需要大约20分钟,所以我不打算接口 同步。即使它生成大量的数据服务器端, 自从本月的数据以来,我仍然希望一切能够保持响应 用户当前正在查看将很快更新,这不是问题。
我考虑过在操作完成后设置会话变量 并轮询该会话变量。这是一种可行的方法吗? 事情?但是,我特别担心 关于用户导航/关闭他们的浏览器然后所有状态 关于长期工作失去了。
在开始和结束时,可能会在处理记录的某处插入记录更好。然后创建一些其他类型的接口,以便用户(或用户)可以监视当前正在执行/已完成/失败的作业?
有没有人可以查看任何资源?
你是怎么做到的?
答案 0 :(得分:5)
代码的服务器端部分应该生成或与位于Web服务器之外的进程通信。使用网页代码来运行应该由守护程序处理的任务只是草率的工作。
答案 1 :(得分:2)
你不能指望他们闲逛20分钟。即使是世界上最合作的用户也必然要做其他事情,忘记并关闭窗口。允许这么长的连接时间会搞砸任何合理的HTTP超时的机会,并让你对普通的DOS开放。
正如Spencer建议的那样,使用第一个请求启动一个独立于http请求的进程,在AJAX响应中传回一个id,将id存储在会话中,或者存储在针对该用户的数据库中,或者你想要的任何内容中。然后,用户可以随心所欲地执行任何操作,并且不会中断任务。 id可用于轮询状态。如果将其保存到数据库,用户可以注销,清除他们的cookie,当他们重新登录时,您仍然可以检索任务的状态。
答案 2 :(得分:0)
会话不是那么可行,我可能会设计某种任务列表。所以我可以保留每个用户的任务记录。通过这种设计,我将能够显示“完成”任务,以保持用户的意识。
此外,我会将长时间操作移出工作进程。这是必需的,因为可以重新调整Web服务器。
而且,是的,我将通过ajax调用从服务器每隔几十秒请求一次状态。
答案 3 :(得分:0)
您可以使用JS计时器定期ping您的服务器以查看是否已完成任何作业。如果用户离开并返回,则重新启动计时器。完成工作后,您可以向用户表明,这样他们就可以点击链接并打开报告(虽然可以做到,但我不建议强行加载)
答案 4 :(得分:0)
根据我的经验,最好的方法是在服务器端保存为每个用户运行的报告及其状态。然后,客户端将定期轮询此状态。 基本上,客户端要求服务器getRunningJobsFor(int userId)返回所有正在运行的作业和状态,而不是checkStatusOf(int session)。