在Java Web应用程序中执行长任务(仅由用户和该用户触发)的最佳方法是什么?我尝试使用ejb @Asynchronous和jax-ws异步(轮询)调用但是Future<?>它们返回的是不可序列化的,无法存储在HttpSession中(以便在完成后检索结果)。是否有一种简单的方法来使用并发的Future<?>在Java Web环境中还是我必须使用完整的作业管理框架?
答案 0 :(得分:1)
最好是使用JMS。实现异步的消息传递解决方案,该消息传递消息到队列/主题,其中MDB侦听在到达消息时触发的队列/主题以离线方式执行长任务
http://www.javablogging.com/simple-guide-to-java-message-service-jms-using-activemq/
答案 1 :(得分:1)
如果你的进程应该生成一个结果并且你希望这个过程花费很长时间,那么最好的方法就是两个有两个单独的调用:
所以你的整个流程将是:
答案 2 :(得分:1)
到目前为止,最佳解决方案是使用应用程序范围的Map< SessionId,List< Future<?>>>。这适用于具有粘性会话的群集,不需要在数据库中使用JMS队列和结果存储。