用户之间的Java动态bean /共享

时间:2014-10-23 08:57:38

标签: java spring

我有java web应用程序,正被多个用户使用。用户我指的是实际连接到应用程序并使用它做事的人。

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

到目前为止我尝试了什么:

有一个EDIT按钮,用户单击以编辑某些模式。当他们点击它时,会触发一个方法。

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存在。对此有何建议?我做错了什么?

1 个答案:

答案 0 :(得分:1)

那样的事情(我不明白你为什么需要春季托管豆):

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);
        }
    }
}