ConcurrentAccessTimeoutException в EJB-компоненте-одиночке - PullRequest
0 голосов
/ 16 мая 2018

Получение следующего исключения при чтении метода из одноэлементного компонента EJB. Несмотря на то, что установлен тайм-аут 60 секунд, показывается исключение 5000 МИЛЛИСЕКОНД. Как увеличить этот срок?

Причина: javax.ejb.ConcurrentAccessTimeoutException: WFLYEJB0241: EJB 3.1 PFD2 4.8.5.5.1 тайм-аут одновременного доступа на TestBean-мог не получить блокировку в течение 5000MILLISECONDS

Вот настройка времени ожидания на бобе:

@AccessTimeout(value = 60, unit = TimeUnit.SECONDS)
@Lock(LockType.READ)
public class TestBean {

1 Ответ

0 голосов
/ 16 мая 2018

Бин Singleton, как определение, может быть создан только один раз. Это означает, что по умолчанию @lock ("write") устанавливается в синглтоне каждый раз, когда вызывается его метод.

Все запросы будут сериализованы контейнером EJB, если метод компонента уже вызван.

Время запускается, когда запрос сериализуется. @AccessTimeout относится к этому времени. Если асинхронный запрос еще не завершен и время, заданное вами в @AccessTimeout, уже прошло, возникает исключение. Некоторые EJB-контейнеры используют свои собственные значения по умолчанию, и в вашем случае EJB-КОНТЕЙНЕР для wildfly - это тот, который появляется в ошибке.

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

@ AccessTimeout (0), это означает, что запрос не может быть сериализован, и он должен быть выполнен немедленно, если синглтон свободен, в противном случае он будет потерян.

Я рекомендую передать эту обработку параллелизма на уровень метода, чтобы вы могли легко манипулировать bean-компонентом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...