2011-02-04 4 views
1

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

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

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


TLDR: проверить, есть ли блокировка на шов разговора, не пытаясь получить к нему доступ (что может привести к срабатыванию одновременный вызов разговора исключения)

Все указатели, предложения, очень ценятся.

+0

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

+0

Как вы проводите опрос на разговоры? Очередь может быть действительным подходом, как говорит @reistiago. –

ответ

1

Я предполагаю, что вы используете Seam2 (так как этот вопрос уже давно висит).

Существует класс сеанса ConversationEntries, который дает вам доступ ко всем сеансам сеанса. Вы можете попросить его вернуть информацию обо всех разговорах, позвонив по телефону getConversationEntries()

Тогда вы можете позвонить по каждому ConversationEntry методу lockNoWait(), чтобы получить блокировку. Он немедленно вернется с false, когда запись заблокирована другим потоком. Он вернет true, если ни один другой поток не удерживает блокировку (в этом случае вы сразу вызываете unlock()).

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

С уважением, Alexander.

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