Проверьте, используется ли шовский разговор без блокировки

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

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

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


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

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

1 ответ

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

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

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

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

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

Другие вопросы по тегам