Калитка: как синхронизировать запросы внутри сессии - PullRequest
2 голосов
/ 03 декабря 2009

Сценарий: веб-приложение на основе Apache Wicket, работающее на сервере Tomcat.

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

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

  1. сделать все классы приложений поточно-ориентированными (очень дорогостоящими)

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

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

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

Спасибо

Ответы [ 2 ]

4 голосов
/ 03 декабря 2009

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

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

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

3 голосов
/ 03 декабря 2009

Какое исключение выдается? Если выдается исключение, то я предполагаю, что существует критическая секция объекта 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.
 */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...