2014-10-23 4 views
0

나는 여러 사용자가 사용하고있는 자바 웹 응용 프로그램이 있습니다. 사용자는 실제로 응용 프로그램에 연결하고 그 응용 프로그램을 사용하는 사람들을 의미합니다.자바 다이나믹 빈/사용자간에 공유

모든 사용자는 ID가있는 스키마를 편집 할 수 있습니다. 현재 여러 사용자가 동일한 스키마를 동시에 편집 할 수 있습니다. 데이터베이스/테이블을 사용하지 않고 문제를 해결하고 싶습니다. 지금까지 시도 무엇

:

편집 버튼은 사용자가 특정 스키마를 편집합니다 것이있다

. 사용자가 클릭하면 메소드가 트리거됩니다.

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

나는이 방법이 트리거 될 때 나는, 스키마 ID와 콩을 만들 수 있습니다 생각.

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

이 콩을 만들었을 때 필요한 것은 다음 사용자가 있는지 확인하는 것입니다. 이것은 나에게 좋은 소리 이론적으로

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

, 편집 버튼을 해당 스키마로 만든 콩이 있다면 트리거하지 않습니다. 그러나 빈은 생성되지 않는다. (또는 적어도 한 명의 사용자 만 접근 할 수있다.) 여기 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이 내가 그러나 (주석 ctx.refresh)를 새로 경우의 BeanFactory는, 새로해야한다는 말을 얻을, 나는 그런 콩이 없음을 얻는다. 이것에 대한 조언? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

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

는 사실이 매우 유사합니다을 내가 처음에 가지고 있던 것에는 콩 만들기 (외부 config.xml 파일)에 익숙하지 않아서 봄이 내 삶을 더 편하게 만들 것이라고 결정했다. – CrazySabbath

+0

흠, 당신이 나를 오해 한 것 같아요, 아니면 당신을 오해 한 것 같아요. 당신의 메소드 생성 빈은 한 사용자 만 접근 할 수 있습니다 (세션 범위라고 생각합니다), 다른 로그인 한 사용자는 그것을 볼 수 없습니다. 필요한 것은 응용 프로그램 범위에서 액세스 할 수있는 데이터가있는 bean (lockedModels)입니다. 한 사용자가 빈을 만들고 다른 사용자 (로그인 한 경우)가 해당 빈에 액세스 할 수 있습니다. 그건 그렇고 이상한 오류가 있습니다. [바람둥이 여기에 로그하십시오.] (http://codepad.org/6eFQbxNM) – CrazySabbath

+0

아마도 코드를 더 공유해야 할 것입니다. 스프링없이 답을 편집 할 것입니다. –