Как вы можете синхронизировать два запроса от одного пользователя в JSF? - PullRequest
0 голосов
/ 05 мая 2011

По сути, моя проблема в том, что если пользователь нажимает одну кнопку и ждет ответа страницы, а затем нажимает другую кнопку, создается впечатление, что существует условие гонки.

Как можно избежать кода для первой кнопки, используя те же переменные, что и код для второй кнопки?

Я подозреваю, что оба запроса будут вызывать одни и те же геттеры и сеттеры в некотором случайном порядке, потому что каждое нажатие кнопки будет происходить на отдельной фазе модели JSF.

Вот пример. Предположим, пользователь нажимает кнопку, функция действия изменяет некоторую переменную. Эта переменная связана с геттером и сеттером с тегом актуального jsf. Теперь предположим, что функция действия выполнена на 50%. Теперь пользователь нажимает ту же кнопку. JSf будет вызывать методы получения и установки, связанные с этой же переменной, восстанавливая состояние или что-то еще. По сути, эта переменная сбрасывается до того, что было до того, как действие изменило ее. Теперь функция действия для первого клика продолжает выполняться, и она снова меняет переменную. Даже после второго вызова действия это условие гонки.

1 Ответ

1 голос
/ 05 мая 2011

Ну, на стороне клиента вы можете посмотреть на JavaScript, чтобы отключить несколько представлений, например. отключить отправку типа ввода после нажатия. Это ни в коем случае не надежный механизм.

В самом JSF это зависит от объема Бина. Если он ограничен сессией, вы можете синхронизировать доступ к его методу действия (то есть вызывать метод приложения), чтобы только один поток за раз мог выполнять логику. Также вы можете синхронизировать доступ к общим данным. Это будет работать только если у вас есть сессия сродства, хотя. Если нет, то вы будете бороться!

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

Как правило, кодирование и сборка вашего приложения означает, что вы должны иметь возможность обрабатывать несколько запросов одного и того же пользователя. Хотя лично я придерживаюсь подхода JavaScript, чтобы не допустить многократную отправку форм. Вы хотите объяснить более подробно, возможно, с помощью фрагментов кода, какую проблему вы чувствуете?

...