一种简化的方法是创建一个类来跟踪状态栏需要显示的统计信息。例如:
public class MessageCreatorProgress {
private final int totalMessagesToBeCreated;
private final AtomicInteger successCount;
private final AtomicInteger failureCount;
// constructor to initialize values
// increment methods
// get methods
}
在启动线程的初始请求中,使用MessageCreatorProgress 的共享实例构造线程。例如:
// endpoint method to create a bunch of messages
public String startCreatingMessages(CreateMessagesRequest request) {
MessageCreatorProgress progress = new MessageCreatorProgress(requesst.getThreadCount * request.getMessageCountPerThread());
for (...) {
new MyMessageCreator(progress, request.getSomeParameter(), ....).start();
}
String messageProgressId = some unique value...
// Store MessageCreatorProgress in the session or some other shared memory,
// so it can be accessed by subsequent calls.
session.setAttribute(messageProgressId, progress);
return messageProgressId;
}
例如,每个MyMessageCreator 实例都将调用progress.incrementSuccess() 作为最后一步,或者调用progress.incrementFailure() 作为例外。
AJAX 调用将messageProgressId 传递给状态端点,该端点知道如何访问MessageCreatorProgress:
// endpoint method to get the message creation progress
// transform to JSON or whatever
public MessageCreatorProgress getMessageCreationProgress(String messageProgressId) {
return session.getAttribute(messageProgressId);
}
更复杂的方法是使用数据库 - 例如,当 AJAX 调用不会命中运行正在创建消息的线程的同一服务器时。当线程成功或发生异常时,它可以更新与messageProgressId 关联的记录,AJAX 端点检查数据库并构造MessageCreatorProgress 以返回给客户端。