gpt4 book ai didi

Java 动态 bean/用户之间共享

转载 作者:行者123 更新时间:2023-12-01 12:23:10 25 4
gpt4 key购买 nike

我有 java web 应用程序,正在被多个用户使用。我所说的用户是指实际连接到应用程序并使用它进行操作的人。

每个用户都可以编辑具有 ID 的架构。目前,多个用户可以同时编辑同一个模式。我想解决这个问题,而不使用数据库/表。

到目前为止我尝试过的:

有一个“编辑”按钮,用户单击该按钮可以编辑某些架构。当他们点击它时,就会触发一个方法。

protected SessionLockModSchema sessionLockModSchema = new SessionLockModSchema();
protected Model model; //schema model object
public void buttonClick(ClickEvent event) {
//button logic goes here
}

我想当这个方法被触发时,我可能会创建一个带有架构 ID 的 bean。

protected SessionLockModSchema sessionLockModSchema = new SessionLockModSchema();
protected Model model;
public void buttonClick(ClickEvent event) {
//button logic goes here
this.sessionLockModSchema.lockSchema(model);
}

当我创建这个 bean 时,我需要做的就是为下一个用户检查它是否存在。

protected Model model;
public void buttonClick(ClickEvent event) {
if(!this.sessionLockModSchema.isSchemaLocked(model){
//button logic goes here
this.sessionLockModSchema.lockSchema(model);
}
}

理论上这对我来说听起来不错,如果有使用该模式创建的 bean,则编辑按钮不会触发。但 Bean 并未创建(或者至少只有一个用户可以访问它)。这是 sessionLockModSchema 类:

public class SessionLockModSchema{

ApplicationContext context;
GenericApplicationContext ctx;

public SessionLockModSchema(){
if(ctx == null){
this.ctx = new GenericApplicationContext();
}
}

public void lockSchema(Model model){
String beanName = "model-"+model.getId();

BeanDefinitionBuilder bDBuilder = BeanDefinitionBuilder .rootBeanDefinition(String.class);
bDBuilder.setScope("prototype");
this.ctx.registerBeanDefinition(beanName, bDBuilder.getBeanDefinition());
//appcontext.close();
}

public boolean isSchemaLocked(Model model){
String beanName = "model-"+model.getId();
Object objectRef = null;
try{
//ctx.refresh();
objectRef = this.ctx.getBean(beanName);
}catch(NoSuchBeanDefinitionException e){
// TODO:
}catch(IllegalStateException e){
// TODO:
}
boolean isLocked;
if(objectRef == null){
isLocked = false;
}else{
isLocked = true;
}
return isLocked;

}
}
为了澄清我的问题,我收到 IllegalStateException 说必须刷新 beanFactory,但是如果我刷新(注释为 ctx.refresh),我会发现不存在这样的 bean。对此有什么建议吗?我做错了什么?

最佳答案

类似的东西怎么样(我不明白为什么你需要这里 Spring 管理的 bean):

public enum SessionLockModSchema {
INSTANCE;

private final Set<String> lockedModels = new HashSet<>;

public void lockSchema(Model model){
synchronized(lockedModels) {
lockedModels.add("" + model.getId());
}
}

public void unlockSchema(Model model){
synchronized(lockedModels) {
lockedModels.remove("" + model.getId());
}
}


public void isSchemaLocked(Model model){
synchronized(lockedModels) {
return lockedModels.contains("" + model.getId());
}
}
}

用法(类似的东西):

public void buttonClick(ClickEvent event) {
if (SessionLockModSchema.INSTANCE.isLocked(model) {
try {
SessionLockModSchema.INSTANCE.lockSchema(model);
// do something with "model"
} finally {
SessionLockModSchema.INSTANCE.unlockSchema(model);
}
}
}

关于Java 动态 bean/用户之间共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26524560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com