2012-04-17 4 views
1

그래서 직렬화, 개찰 및 다중 스레드 프로젝트에 다소 제한적인 경험이 있으므로 나와 함께 감내해야합니다.개찰 및 다중 스레드 비즈니스 객체

기본적으로 내 웹 응용 프로그램 클래스는 a를 만드는 POJ (parentObject)를 인스턴스화하여 새 타이머를 시작하고 타이머가있는 여러 POJ (childObjects)를 인스턴스화합니다. 이러한 childObject는 parentObject 클래스의 목록에 저장됩니다. 내 개찰구 응용 프로그램에서 페이지는 parentObject에 액세스해야하는, 그래서 그것을 액세스도록 만든 :

public Object getParentObject 
{ 
    return this.parentObject; 
} 

그리고과 같이 각 페이지에서 검색되는 :

((MyApplication)Application.get()).getParentObject() 

문제는 현재 있다는 것입니다 TimerTask를위한 parentObject와 childObject는 더 이상 매분마다 호출되지 않습니다. 내 로그는 parentObject의 첫 번째 시작을 선택하지만 로깅 메시지는 다시 출력되지 않습니다. 즉, 부모 Object의 timertask의 run() 메소드가 매분마다 실행되지 않는다는 신호입니다. 자식 객체에서도 마찬가지입니다. 타이머가 한 번만 실행되는 것처럼 보입니다. 다음은 내가 가지고있는 의사 코드입니다.

public class childObject implements Serializable 
{ 
    private transient NamedParameterJdbcTemplate njt; 
    private transient Timer timer; 

    public childObject(DataSource ds) 
    { 
     this.njt = new NamedParamterJdbcTemplate(ds); 
    } 

    public void start() 
    { 
     timer = new Timer(); 

     timer.schedule(new TimerTask(){ 

      public void run() 
      { 
       //do some stuff that is never happening 
      } 

     }, 0, 60000); 
    } 
} 

public class ParentObject implements Serializable 
{ 
    private DataSource ds; 
    private List<ChildObject> childObjects; 
    private transient Timer; 

    public ParentObject(DataSource ds) 
    { 
     this.ds = ds; 
     //add some stuff to childObjects 

     timer = new Timer(); 

     timer.schedule(new TimerTask(){ 

      public void run() 
      { 
       for(some condition) 
       { 
        //Do some stuff 

        if(/*condition is met*/) 
        { 
          //starts the child's timer to do stuff 
         childObjects.get(i).start(); 
        } 
       } 
      } 

     }, 0, 60000); 
    } 
} 

public MyApplication extends WebApplication 
{ 
    private ParentObject object; 
    private DataSource ds; 

    public void init() 
    { 
     super.init(); 

     ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml"); 
     ds = (DataSource) context.getBean("dataSource"); 

     parentObject = new ParentObject(ds); 
    } 
} 

이러한 객체를 Serializable으로 만들어야합니까? String, 정수, 해당 클래스의 멤버 인 변수의 날짜 정렬은 있지만 객체 자체는 wicket 구성 요소에 연결되지 않습니다.

+1

음, 왜 [이전 질문] (http://stackoverflow.com/questions/10181865/wicket-application-serialization-and-java-timers)을 오늘 (사소한 변경 사항)에 다시 게시 했습니까? 원본을 편집하고 개선 할 수는 있지만 중복을 추가하지 마십시오. – Jonik

+0

질문은 실제로 완전히 반대입니다. 하나는 스레드가 너무 많아서 어떤 이유로 스레드가 죽었습니다. 나는 Wicket이 다중 쓰레드를 가진 POJ를 가지고있는 것을 좋아하지 않는 이유에 대해 여전히 혼란 스럽긴하지만, artbristol의 조언을 아래의 간단한 해결책처럼 보이기 위해 갈 것이다. – thatidiotguy

+2

오, 실례합니다; 그 거의 모든 것이 축 어적으로 복사 될 때를 말하기는 어렵습니다. (그리고 나는 실제로 눈으로 그것들을 "diffing"했습니다.) 일반적으로 이런 종류의 연속 질문은 ** 다른 질문에 연결하여 ** 문맥을 제공하고 나면 당신이 묻고있는 * 새로운 질문이 무엇인지를 매우 명확하게 설명하면 * 더 * 더 좋습니다. 주요 점을 강조 표시합니다 (예 : 굵은 글씨체). 두 곳에서 모든 코드를 복사하여 붙여 넣지 마십시오. 단지 관련성이 있거나 다른 부품 (있는 경우). – Jonik

답변

1

Wicket은 근본적으로 단일 스레드입니다 (다중 스레드를 제대로 수행하는 것이 어려워서 가장 좋은 GUI 프레임 워크이기 때문에). 인스턴스화 작업을 피해야합니다. (타이머를 일시적으로 표시하면 문제의 원인이 될 수있는 방식으로 비 직렬화시 손실 될 수 있습니다.)

요청시 Wicket 구성 요소가 액세스 할 수있는 서비스 계층을 가질 수 있도록 응용 프로그램을 재구성해야합니다 LoadableDetachableModels를 사용하여. 서비스 계층은 Wicket이 아닌 Spring에 의해 관리되기 때문에 태스크 등을 가질 수 있습니다.

+0

그래, 그게 내가 지금하고있는 일이다. 나는 그것이 성공했는지에 관해서 다시보고 할 것이다. 조언 감사합니다. – thatidiotguy

+0

같은 페이지 인스턴스로만 작업하는 것이 단일 스레드입니다. 두 개 이상의 페이지 인스턴스 또는 세션 또는 응용 프로그램과 함께 작업하는 것은 단일 스레드가 아닙니다. 그래서 조심해! :-) –

+0

@ martin-g 당신은 명확하고 명확하게 해주셔서 감사합니다. – artbristol