2012-04-17 2 views
1

Итак, у меня есть несколько ограниченный опыт работы с сериализацией, Wicket и многопоточными проектами, так что несите меня.Wicket And Multi-threaded Business Object

По существу мой класс веб-приложений создает экземпляр POJ (parentObject), который создает начало нового таймера и создает несколько POJ (childObjects), которые также имеют в них таймеры. Эти объекты childObject хранятся в списке в классе parentObject. Страницы в моей калиткой приложения должны получить доступ parentObject, поэтому я сделал его доступным, как так:

public Object getParentObject 
{ 
    return this.parentObject; 
} 

И извлекается на каждой странице, как так:

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

В настоящее время проблема заключается в том, что TimerTask для как parentObject, так и childObjects больше не вызывают каждую минуту, как они должны быть. Мои журналы берут первый запуск объекта parentObject, но сообщение о регистрации больше не выводится, сигнализируя, что метод run() родительского объекта Timertask не выполняется каждую минуту. То же самое справедливо и для дочерних объектов. Кажется, что таймеры только исполняются один раз. Ниже приведены некоторые псевдокоды для того, что у меня есть

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, integer, Date сортирует переменные, которые являются членами их классов.

+1

Умм, почему вы повторно опубликовали свой [более ранний вопрос] (http://stackoverflow.com/questions/10181865/wicket-application-serialization-and-java-timers) с сегодняшнего дня (с незначительными изменениями)? Вы можете редактировать и улучшать оригинал, но, пожалуйста, не добавляйте дубликаты. – Jonik

+0

Вопрос на самом деле полностью противоположный. У одной проблемы была слишком много потоков, и теперь по моим причинам мои потоки убиты. Я просто собираюсь пойти с советом artbristol ниже, поскольку это похоже на простейшее решение, хотя я все еще смущен тем, почему Wicket не любит иметь POJ, которые имеют несколько потоков. – thatidiotguy

+2

О, простите меня; это трудно сказать, когда почти все это скопировано дословно (и я на самом деле потратил минуту «отличить» их глазами). В общем, этот вопрос продолжения будет * намного лучше, если вы ** ссылаетесь на свой другой вопрос **, чтобы предоставить контекст, а затем очень четко объясните, что нового * вопроса, который вы задаете. Выделите ключевые точки (например, полужирный). Не копируйте все коды в обоих местах; просто релевантные/разные части (если есть). – Jonik

ответ

1

Wicket в основном однопоточный (как и самые хорошие графические интерфейсы GUI из-за трудности получения права на многопоточность), и вам следует избегать создания экземпляров задач. (Маркировка таймера как переходного означает, что он потеряется при десериализации, кстати, что может быть причиной ваших проблем)

Вы должны закрепить свое приложение, чтобы иметь сервисный уровень, к которому обращаются компоненты Wicket по запросу, возможно используя LoadableDetachableModels. Уровень сервиса может иметь задачи и т. Д., Поскольку управление им будет выполнять Spring, а не Wicket.

+0

Да, это то, что я делаю сейчас. Я расскажу о том, успешна ли она. Спасибо за совет. – thatidiotguy

+0

Работает только с одним экземпляром страницы. Работа с двумя или более экземплярами страницы или с сеансом или с приложением не является однопоточной. Так что будьте осторожны! :-) –

+0

@ martin-g Вы совершенно правы и спасибо за разъяснение – artbristol