从@Controller方法获取异步进程的执行状态,以便我可以在HTML页面中显示当前进度。
情形:
http://localhost/foo
,控制器实例化BackgroundAsyncService
并调用workAsync
方法。 BackgroundAsyncService
已自动连接到控制器。http://localhost/foo-1
,想要查看之前开始的进程状态。从JSP我使用AJAX来轮询控制器。调用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
答案 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");
}
}