спящий режим «открытая сессия в поле зрения» и асинхронные задачи - PullRequest
3 голосов
/ 18 октября 2010

Я использую шаблон Open Session in View для моего приложения jsf / icesfaces.Как обычно, фильтр сервлетов открывает и закрывает все сеансы гибернации в начале и в конце «потока веб-сервера».

Моя проблема сейчас в том, что я использую асинхронные задачи, напримерзагрузка больших списков объектов из базы данных.Поэтому я создаю новый поток «вручную», который выполняет задачу.

Теперь мой вопрос: каков наилучший способ обработки сеансов гибернации для таких асинхронных задач?Должен ли я вручную создавать сеанс в самом потоке или есть что-то вроде фильтра сервлетов также для потоков (что-то, что открывает сеанс, когда поток запускается, и закрывает его, когда он заканчивается)?любые лучшие приметы или тому подобное.Спасибо.

Вот код, который создает поток:

protected static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5,
            15, 50, TimeUnit.SECONDS, new LinkedBlockingQueue(20));

// called by action method of a button
private void asyncLoading() {

        SessionRenderer.addCurrentSession(this.renderGroup);            

        threadPool.execute(new Thread() {   
                // do the thing to do (...)
                }
}

1 Ответ

0 голосов
/ 18 октября 2010

Вообще говоря, фильтры «Открыть сеанс в представлении» довольно просты: открыть сеанс, прикрепить его к ThreadLocal, закрыть в конце.Изменения между реализациями заключаются в том, как достичь сеанса, хранящегося в ThreadLocal.Таким образом, в зависимости от используемой реализации компонента «Открыть сеанс в представлении», либо существует доступная фабрика, которая не привязана к используемому фильтру, либо (почти во всех случаях) вы можете посмотреть на источникфильтровать и подражать обработке вокруг "// делать то, что нужно сделать (...)".

...