我的应用程序中有一个进程,它通过 Servlet 将文档上传到我的服务器并等待完成,然后服务器使用 2 个线程处理文件,并保持Status
运行时的状态。
这是Status
该类的外观:
class Status implements Serializable {
private Integer read;
private Integer validated = 0;
private Integer processed = 0;
private Integer failed = 0;
public Status (int read) {
this.read = read;
}
/*
* Getter methods go here.
* No Setter methods.
*/
public void incrementValidated() {
synchronized(validated) { validated++; }
}
public void incrementProcessed() {
synchronized(processed) { processed++; }
}
public void incrementFailed() {
synchronized(failed) { failed++; }
}
}
现在,服务器以这种方式处理文件:
- 线程根据 DB 值验证读取的行,将正常的行放入队列中。
- 一个线程一直等待,直到队列中有一批项目,然后它持久化这批 X 项目。
当Status
项目正常 ( incrementValidated
)、项目持久 ( incrementProcessed
) 和项目无效 ( incrementFailed
) 时更新。Status
存储在 a中,其中ConcurrentHashMap<String, Status>
key 是用户的 sessionID(因为这个过程可以处理多个请求)。
在进程运行时,客户端也通过 Servlet 轮询服务器,它所做的只是return statusMap.get(sessionId);
直到进程完成。
我的问题出现在运行时间过长的文件上,例如 5 分钟。当它运行并轮询服务器以获取状态时,有时所有值都设置回 0,唯一保持不变的值是read
属性。
我不确定这怎么可能,因为该对象没有设置器,所以我只能想象该对象正在使用构造函数上的相同值重新实例化,因此保持相同的值。
这甚至可能吗?还是我错过了什么?
(发生这种情况时,地址似乎发生了变化)