Spring MVC:Controller和Asynchronous方法之间的通信

时间:2016-10-06 13:56:24

标签: java spring-mvc asynchronous

我想要实现的目标......

从@Controller方法获取异步进程的执行状态,以便我可以在HTML页面中显示当前进度。

情形:

  1. 用户打开http://localhost/foo,控制器实例化BackgroundAsyncService并调用workAsync方法。 BackgroundAsyncService已自动连接到控制器。
  2. 用户打开http://localhost/foo-1,想要查看之前开始的进程状态。从JSP我使用AJAX来轮询控制器。
  3. 问题

    调用i方法后是否可以获得workAsync的值? 关于我必须记录的主题应该是什么,以便我能够得出上述答案?

    服务类

    @Service
    public class BackgroundAsyncService implements FutureService {
    
      private static final Logger LOGGER = Logger.getLogger(BackgroundAsyncService.class);
    
      @Async
      public Future<String> workAsync() {
        LOGGER.debug("workAsync begin...");
        try {
          for (int i = 0; i <= 1000; i++) {
            Thread.sleep(100);
            LOGGER.debug("i : " + i);
          }
        } catch (InterruptedException interruptedException) {
          LOGGER.error(interruptedException);
        }
        LOGGER.debug("workAsync end.");
        return new AsyncResult<String>("foo");
      }
    
    }
    

    我正在使用

    春季4.2.5.RELEASE
    Java 1.7

2 个答案:

答案 0 :(得分:0)

你的异步方法可能是更新数据库,缓存中的寄存器或只是一个简单的最终静态HashMap,然后你的页面检查值。如果您想通知页面deferred result

请记住,如果在不使用数据库时复制应用程序,则可能需要分布式缓存。

答案 1 :(得分:0)

使用ApplicationContext,您可以从spring容器中获取BackgroundAsyncService组件。从默认情况下它是单例,因此它应该是相同的实例。在某些提及http://localhost/foo-1的行动中,您可以获得&#34; i&#34;值。

BackgroundAsyncService backgroundAsyncService = (BackgroundAsyncService) context.getBean(BackgroundAsyncService.class);
int i = backgroundAsyncService.getI();

您可以尝试调整BackgroundAsyncService类的大小:

@Service
public class BackgroundAsyncService implements FutureService {

    private static final Logger LOGGER = Logger.getLogger(BackgroundAsyncService.class);

    private int i;

    public int getI() {
        return i;
    }


    @Async
    public Future<String> workAsync() {
        LOGGER.debug("workAsync begin...");
        try {
            for (this.i = 0; this.i <= 1000; this.i++) {
               Thread.sleep(100);
               LOGGER.debug("i : " + this.i);
            }
        } catch (InterruptedException interruptedException) {
            LOGGER.error(interruptedException);
        }
        LOGGER.debug("workAsync end.");
        return new AsyncResult<String>("foo");
    }

}