2009-12-03 4 views
2

Сценарий: веб-приложение Apache Wicket, запущенное на сервере Tomcat.Wicket: как синхронизировать запросы в сеансе

Пользователь открывает URL-адрес в браузере, сеанс создается, а простая веб-страница отображается в браузере, пользователь нажимает кнопку и Вызывается вызов AJAX. Приложение получает запрос и выполняет некоторые действия по подготовке ответа. В то же время пользователь или JavaScript в браузере вызывает другой вызов AJAX - этот второй запрос обрабатывается в другом потоке в приложении и потому, что большинство частей приложения зависят от сеанса и не являются потокобезопасными (поскольку один пользователь = один сеанс), исключение бросает.

Возможные решения:

  1. делают все классы приложений потокобезопасной (очень дорого)

  2. адаптировать графический интерфейс, так не одновременно курсирует два AJAX вызовов в одной сессии (не представляется возможным из-за характера графического пользовательского интерфейса браузера)

  3. синхронизировать все запросы в одной сессии на калитке или уровне Tomcat (но как?)

  4. другая практика или техника ???

Благодаря

ответ

4

Запросы на страницы или компоненты в пределах одной и той же PageMap в одной сессии, уже синхронная - только один поток одновременно. Запросы на ресурсы, такие как , изображения, javascript, css-файлы и т. Д. Обрабатываются асинхронно. (Различные клиенты никогда не блокируют друг друга, так как каждый клиент имеет свою собственную сессию и PageMap).

Однако доступ к элементам в самом сеансе, я считаю, явно не синхронизирован.

Кстати, доступ к сеансу/страницам из потока, который не является потоком запроса, не является хорошей идеей, так как контейнер может свободно что-либо делать с вашим сеансом/страницей между запросами - например, записать его на диск и т. д.

+0

Как вы уже упоминали, в конечном итоге это был параллельный доступ от обработки потока запроса и другого потока, который был запущен в другом ранее обработанном запросе. Wicket (I belive) действительно синхронизирует запросы с одной страницы. Спасибо. – mschayna

3

Что исключение, которое выбрасывается? Если выбрано исключение, я бы предположил, что существует критический раздел объекта Session, который необходимо синхронизировать или обрабатывать с большей осторожностью и, возможно, не весь сеанс.

У меня не было причин использовать их много, но я знаю, что есть каналы как часть wicket-ajax.js (найдено в пакете org.apache.wicket.ajax). Они контролируют обработку нескольких вызовов AJAX. Возможно, стоит посмотреть. В этом файле следующий комментарий:

/** 
* Channel management 
* 
* Wicket Ajax requests are organized in channels. A channel maintain the order of 
* requests and determines, what should happen when a request is fired while another 
* one is being processed. The default behavior (stack) puts the all subsequent requests 
* in a queue, while the drop behavior limits queue size to one, so only the most 
* recent of subsequent requests is executed. 
* The name of channel determines the policy. E.g. channel with name foochannel|s is 
* a stack channel, while barchannel|d is a drop channel. 
* 
* The Channel class is supposed to be used through the ChannelManager. 
*/ 
+0

Я думаю, что конкретное исключение не имеет значения, на самом деле это было ConcurrentModificationException. Более важным является то, что код, который не является поточнобезопасным по дизайну, вызывался одновременно из двух потоков. Я хочу заблокировать это предпочтительно на уровне Wicket. Я не хочу менять всю логику приложения. – mschayna

+0

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

+0

Наконец: это был параллельный доступ из потока обработки запроса и другого потока, который был запущен в другом ранее обработанном запросе.Wicket (I belive) действительно синхронизирует запросы с одной страницы. Благодарю. – mschayna

 Смежные вопросы

  • Нет связанных вопросов^_^