【问题标题】:Send response after task from queue finishes to HttpSession (in GAE)队列中的任务完成后发送响应到 HttpSession(在 GAE 中)
【发布时间】:2016-03-05 22:59:30
【问题描述】:

我正在 Google App Engine 中实现一个基本的任务队列。没什么特别的,因为我正在学习介绍。 (推送)队列工作正常,但我想在任务完成时向相关 http 会话的用户发送一点确认(或失败)消息。

我的结构设置方式:

  1. 一个 HttpServlet 接收到一个传入的 HttpServletRequest

  2. HttpSession 中检索到一些信息,用于生成任务 + 将其存储在任务队列中

  3. 另一个HttpServlet(worker)接收来自队列的传入请求以执行任务

  4. 任务被执行

  5. (这是我没有设法实现的步骤:)为 HttpSession 将一些信息发送到 .jsp,该 HttpSession 将任务插入队列

    李>

通常我会通过从 HttpServletRequest 中检索会话来做到这一点,但在这种情况下,发起请求的是队列本身(而不是发起任务的用户)。我无法将 HttpSession 作为字节数组传递给参数,因为我需要保留对同一会话的引用。

我能够将会话中的 id 作为参数传递给我的工作人员,但我不知道如何通过此 id 找到对会话的引用。

这里有可能用 FutureValue 做一些事情:https://github.com/GoogleCloudPlatform/appengine-pipelines/tree/master/java/src/main/java/com/google/appengine/tools/pipeline 但我完全不知道它是如何使用的。

在 HashMap / 数据存储中保存每个用户的 http 会话似乎是一种不好的做法,因为用户可能不想保留数据。

那么,关于如何在任务完成/失败时向启动任务的用户发送异步消息有什么想法吗?

【问题讨论】:

    标签: java google-app-engine session


    【解决方案1】:

    我们在 appengine 之上实现了我们自己的会话系统,但我相信我们所做的对您同样适用。将作业的开始保存在链接到用户会话 ID 的数据存储中的实体中。确保为其添加时间戳,然后在客户端使用轮询来检查作业是否已完成。完成后更新作业的状态,然后在下次轮询状态更新时清除实体。如果用户关闭会话,要清理残留的数据,只需使用 appengine cron 作业在设定的时间后检查并清理旧实体。

    这对我们的实现很有效,而且需要做更多的工作,但是当你的任务是异步的时,这就是你要处理的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      相关资源
      最近更新 更多