java - 在多个登录的 Web 用户之间分隔变量的值
问题描述
我在我的jsp页面中制作了一个进度条,显示了[上传excel文件->将数据从excel文件中提取到java变量->使用这些变量,创建.mp4文件->创建文件后,插入数据库]
我之前的做法是:
在 serviceImpl 中声明私有字符串 xxxx 并在那里制作 getter/setter,并从控制器中使用
serviceImpl.getVARIABLE();
(这在 jsp 中作为 ajax 使用,有间隔)
有效。但是只有当登录用户是单数时它才能正常工作。
如果有 2 个用户同时登录,上传不同的文件,例如进度条必须看起来像
- 对于用户 A: [7/999] ing 。. . .
- 对于用户 B:[92/923123] ing ...
但不是那样,变量得到了同步并且像
- 对于用户 A: [7/999] ing 。. . .
- 对于用户 B: [7/999] ing 。. . .
并且进度出现错误,它在没有完成工作的情况下完成了该方法。
我意识到它非常明显,我的代码非常愚蠢,因为我只是在 serviceImpl 字段中声明了变量并继续使用 setter/getter。
所以我从 serviceImpl 中删除了声明的变量并添加HttpSession session
了方法,使用
session.setAttribute("xxx", xxx);
并从控制器中获取变量的值
session.getAttribute("xxx");
它只与一个用户再次合作。我花了一整天的时间来改变它,当它不起作用时,我终于意识到它也很明显。session.setAttribute
原因 当我的代码都登录时,我的代码怎么知道我
的会话来自用户 A 或 B....
所以我面临着一堵墙,我来寻求帮助。我应该如何区分用户 A 和 B 之间的变量?
控制器:
内部方法A:
a = (int) session.getAttribute("currentStateCount");
b = (int) session.getAttribute("totalRowCount");
服务实现:
内部方法B:
session.setAttribute("currentStateCount", 12+);
内部方法C:
session.setAttribute("totalRowCount", total);
我应该如何使用我的代码来防止变量在不同用户之间同步?如果我的问题或我的 java 技能太愚蠢,我很抱歉.. 也很抱歉英语不好。请帮帮我,谢谢。
你好,我刚刚意识到这不是我的进度条的问题。
我从 serviceImpl 上传、提取、插入文件的方法一次不支持两个文件。
当用户A正在上传文件并且用户B在中间开始上传时,它不会接受用户B,它会等待用户A完成并向用户B发送JDBC连接错误。所以最后只有第一个开始文件上传的人会工作。好伤心,请问有什么办法可以解决吗??
解决方案
这个问题看起来与ServiceImpl
一次只处理一个项目的实现有关。
从那时起,我看到了三个解决方案:
- 在 ServiceImpl 上添加一个“isBusy()”并拒绝新请求,直到处理完现有请求。不是真正的用户友好,但实施起来应该不会太难
- 将 ServiceImpl 的范围更改为具有多个实例。会话范围应该可以解决部分问题,但您仍然必须管理同一会话中的同一用户可以提交多个文件的事实。使用现在更有意义的解决方案 1 可以禁止使用 :)
- 改进 ServiceImpl 以管理许多文件(最好对其进行限制,因此在此处再次使用解决方案 1 会很好:))但是您需要更新方法以指定您想要反馈的文件/结果
如果没有更多关于 ServiceImpl 的详细信息,就很难为这些解决方案提供示例并确认哪一个实际上是最好的。
编辑:在您的 ServiceImpl 中添加一个关于我期望的骨架示例,其中实现了解决方案 3。
import java.io.File;
import java.util.HashMap;
import java.util.Map;
class Scratch {
public interface Worker{
public void process(File file);
public int getStatus();
public int getTotal();
}
public class ServiceImpl{
Map<File, Worker> workers = new HashMap<>();
private static final int MAX = 10;
public void process(File file){
if(workers.size() < MAX) {
Worker worker = null; // replace by actual implementation :)
workers.put(file, worker);
}else{
throw new ArrayIndexOutOfBoundsException("max number of simultaneous operations reached, try again later");
}
}
public int getStatus(File f){
return workers.get(f).getStatus();
}
public int getTotal(File f){
return workers.get(f).getTotal();
}
public void clean(File f){
Worker worker = workers.get(f);
if(worker.getStatus() == worker.getTotal()){
workers.remove(worker);
}else{
throw new UnsupportedOperationException("process is not over, cannot clean it");
}
}
}
}
推荐阅读
- facebook-graph-api - 类似 Tinder 的 Instagram 集成功能
- ruby - 为什么我可以使用像“puts”这样的内核单例方法?
- haskell - 制作对象的 monad 实例时创建连接的问题
- javascript - 需要限制文本框中输入的逗号(,)
- c++ - 通过这个指针访问数据成员
- java - 如何使用`println`在单个语句中格式化和打印多种数据类型?
- excel - 枢轴更改过滤器的宏无效
- c# - ApplicationInsights、Net core 和 HostBuilder(不是 Asp.net)
- powerbi - Powerbi Power Query Editor 将字符串转换为数字时出错
- angular - 将类和关联样式动态添加到元素