java Web应用程序中的长处理作业

时间:2012-05-08 10:05:19

标签: java asynchronous web

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

如果你的进程应该生成一个结果并且你希望这个过程花费很长时间,那么最好的方法就是两个有两个单独的调用:

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

    所以你的整个流程将是:

    1. 客户回电终端服务。
    2. 后端服务启动具有唯一ID的异步进程,并立即将唯一ID返回给客户端。
    3. 异步进程将结果保存在会话或其他更持久的机制(db,file等)
    4. 具有唯一ID的客户端投票服务器
    5. 检索方法返回结果存在,否则返回未完成消息

答案 2 :(得分:1)

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