Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在HttpSession中启动一个流程并将其移交给另一个;“业主”;在会话到期之前?_Java_Session_Runtime.exec - Fatal编程技术网

Java 在HttpSession中启动一个流程并将其移交给另一个;“业主”;在会话到期之前?

Java 在HttpSession中启动一个流程并将其移交给另一个;“业主”;在会话到期之前?,java,session,runtime.exec,Java,Session,Runtime.exec,我(正在尝试)开发一个web应用程序系统,它处理用户请求和计算,并通过扩展线程和Runtime.exec()(在Linux和/或Windows上)将它们传递给服务器上的(定制的)可执行文件。这些计算可能非常耗时,并且可能超过HttpSession的持续时间。如果发生这种情况,并且会话过期,线程/进程也会随着HttpSession一起死亡(对吗?) 我的问题:例如,有没有一种方法可以在会话中启动一个进程并将其移交给一个独立于会话的进程 如果我不能跟踪进程ID,这无关紧要,我只搜索一种方法来启动We

我(正在尝试)开发一个web应用程序系统,它处理用户请求和计算,并通过扩展线程和Runtime.exec()(在Linux和/或Windows上)将它们传递给服务器上的(定制的)可执行文件。这些计算可能非常耗时,并且可能超过HttpSession的持续时间。如果发生这种情况,并且会话过期,线程/进程也会随着HttpSession一起死亡(对吗?)

我的问题:例如,有没有一种方法可以在会话中启动一个进程并将其移交给一个独立于会话的进程

如果我不能跟踪进程ID,这无关紧要,我只搜索一种方法来启动Web服务器上的进程并让它们运行,即使用户的会话过期


我很感谢你的任何想法和提示

您应该使用类似的作业调度库,这样您的作业根本不依赖于HttpSession

我不建议通过
Runtime.exec启动进程,也不建议从web服务器内部创建新线程。虽然这在技术上通常是可行的,但这不是一个好主意。基本上,您正在启动的线程将不在web容器控制之下(它有许多工作线程来处理您的请求)。通过启动您自己的线程,web服务器无法再管理自己的负载,您可能会遇到一大堆意想不到的后果

我要做的是:

  • 当一个新的计算请求进来时,我会创建一个唯一的ID,并用用户ID将其作为“calculation pending”存储在数据库中
  • 然后,我将为请求打包数据,并将其放在JMS队列中,以安排进行计算
  • 您的web容器可以将该ID返回到web浏览器
  • web浏览器可以使用ID返回web服务器,并显示“计算
    ID
    完成了吗?”服务器可以检查数据库并查看状态是否仍为“挂起”
  • 在您的网页上,您可以显示一些“正在处理…”消息和一个进度条,该进度条将定期刷新并检查计算是否仍在进行(例如每10秒刷新一次)。这将使您的HttpSession保持活动状态(尽管这不是必需的,因为用户可以再次登录并检查ID,或者如果您已将用户名存储在DB记录中,则可以查看用户的所有“挂起”计算)
  • 计算将由一个单独的应用程序执行,该应用程序基本上侦听JMS/MQ队列上的传入消息,然后创建一个新线程。现在,这可以在同一台机器上,也可以在不同的机器上(并且使用JMS允许您灵活地使用JMS配置,或者多个“工作”机器侦听JMS消息来执行计算)
  • 计算完成后,“worker”将打包结果并发送JMS响应消息(包括
    ID
  • 回到服务器上,您可以拥有一个消息驱动bean,它将结果插入数据库,并将数据库的状态更改为“finished”,从而使结果可用
  • 现在,当网页刷新时,由于结果可用,您可以重定向到结果页(并从数据库获取结果)
使用JMS的优点:

  • 这些消息可以持久化,如果出现问题,可以重新发送
  • 符合javaee规范
将计算结果存储在数据库中的优点:

  • 看看历史计算
  • 如果计算是幂等的,则可以查找以前计算的结果

希望这会有所帮助。

会话与外部进程无关,但长时间锁定servlet的执行是一种糟糕的方法;您需要使用某种异步消息系统,如共享数据库或某种管道。我认为Coolspot并不是在建议这样做,而是在问如何避免这样做。也许您可以在页面中使用轮询,每N秒或分钟呼叫服务器一次,询问进程是否已完成,这样会话将不会进行expire@LuiggiMendoza:是的,但是httpsession可能会过期是完全可以/需要的。例如,用户可以启动一个为期两天的作业,在三天后注销并返回,而作业是在后台完成的。Th谢谢你,第一眼看上去很有趣!我去看看。