WriteProtectedContextException: The target context for this operation on the name [] from the context [] is a read-only context

Такое вот странное исключение появляется на одном из серверов в кластере WebSphere Application Server:

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

Что такое промежуточный контекст? Если для одного JNDI указано имя some/compound/name/EjbHome, то промежуточные контексты будут такими: some/compound, some/compound/name. Они будут созданы как контексты только для чтения.

Вот что происходит во время старта сервера:

1. Инициализация Сервера Имён.
1.1 Создание пространства имён.
1.2 Обработка настроенных связей (связи, настроенные со скоупом cell, node, и server, связываются с разными частями дерева пространств имён, поэтому они не влияют друг на друга)

2. Инициализация Менеджера Ресурсов.
2.1 Связь настроенных ресурсов (например, JDBC Data Sources, JMS QCF и очереди, JavaMail и прочее) к корню сервера, там же, где будут настроены связи со скоупом server.

Очевидно, что имена, начищающиеся с «cell», «cells», «clusters», «servers» и подобными не должны использоваться (Примечание: Кроме «cell», большинство этих имён могут использоваться, в зависимости места, где они используются, но лучше их не использовать совсем).

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

Для решения проблем, приведших к подобным ошибкам, рекомендуется, хотя бы для server скоупных связей, таких как EJB binding, делать так, чтобы все промежуточные контексты имени JNDI были уникальными (например, не начинать их с jdbc/, jms/, и подобных). 

В моём же случае оказалось, что был создан Environment -> Naming -> Name space bindings, который выглядел примерно как jdbc/someword/someword, то есть начинался с jdbc/, что и приводило к подобной ошибке.

Запомните, что Environment -> Naming -> Name space bindings ни в коем случае не должен начитаться с jdbc, jms и других стандартных зарезервированных имён. Такое вот существует ограничение WebSphere, которое происходит из-за того, что она строит дерево JNDI, и для Data Source и JMS уже выделены ветки jdbc и jms, в которые должны попадать именно Data Source и JMS, а другие ресурсы, вроде Name space bindings туда попадать не должны.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *