Проверьте, используется ли шовский разговор без блокировки - PullRequest
1 голос
/ 04 февраля 2011

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

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

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


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

Любые указатели, предложения, с благодарностью.

1 Ответ

1 голос
/ 28 сентября 2011

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

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

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

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

С наилучшими пожеланиями, Александр.

...