1

在 Java Web 应用程序中执行长任务(由用户触发且仅针对该用户)的最佳方式是什么?我尝试使用 ejb @Asynchronous 和 jax-ws 异步(轮询)调用,但是它们返回的 Future<?> 是不可序列化的,并且无法存储在 HttpSession 中(以便稍后在完成后检索结果)。是否有一种简单的方法可以在 Java Web 环境中使用并发 Future<?> 或者我必须使用成熟的作业管理框架?

4

3 回答 3

3

迄今为止最好的解决方案是使用应用程序范围的 Map<SessionId, List<Future<?>>>。这适用于具有粘性会话的集群,并且不需要使用 JMS 队列和将结果存储在数据库中。

于 2013-03-21T14:38:59.607 回答
2

最好是使用 JMS 。实现一个异步的消息传递解决方案,它将消息发送到队列/主题,其中 MDB 侦听该队列/主题以在消息到达时触发以离线方式执行长任务

http://www.javablogging.com/simple-guide-to-java-message-service-jms-using-activemq/

http://docs.oracle.com/javaee/1.3/jms/tutorial/

于 2012-05-08T10:11:59.207 回答
1

如果您的流程应该生成结果并且您预计该流程需要很长时间,那么最好的方法可能是两个有 2 个单独的调用:

  1. 第一个触发进程并返回唯一进程标识符
  2. 第二个使用进程标识符检索结果

因此,您的整体流程将是:

  1. 客户端调用后端服务。
  2. 后端服务以唯一 ID 启动异步进程,并立即将唯一 ID 返回给客户端。
  3. 异步进程将结果保存在会话或其他更持久的机制(数据库、文件等)中
  4. 具有唯一 ID 的客户端轮询服务器
  5. 检索方法存在时返回结果,否则返回未完成消息
于 2012-05-08T10:46:52.527 回答