我正在Google App Engine中实施基本任务队列。没有什么花哨的,因为我正在学习介绍。 (推送)队列工作正常,但我想在任务完成时向相关http会话的用户发送一点确认(或失败)消息。
我的结构设置方式:
HttpServlet 接收传入 HttpServletRequest
从 HttpSession 中检索一些信息,用于生成任务+将其存储在任务队列中
另一个 HttpServlet (工作者)从队列接收传入请求以执行任务
任务执行
(这是我没有设法实现的步骤:)将一些信息发送到.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会话似乎是不好的做法,因为用户可能不想保留数据。
那么,关于如何在任务完成/失败时将异步消息发送回启动任务的用户的任何想法?
答案 0 :(得分:0)
我们在appengine之上实现了我们自己的会话系统,但我相信我们所做的对您来说也是如此。将作业的开始保存在数据存储区中的实体中,该实体链接到用户的会话ID。确保为其加上时间戳,然后在客户端使用轮询来检查作业是否已完成。完成后更新作业的状态,然后在下次轮询状态更新时清除实体。要清理用户关闭会话时所附带的数据,只需使用appengine cron作业通过并在设定的时间后清理旧实体。
这对我们的实现来说效果很好,而且还有一些工作,但是当你的任务是异步时,这就是你正在处理的事情。