Сохраняющийся массив байтов в дереве JNDI в JBoss

Как часть приложения Java EE, которое я разрабатываю на JBoss, мне нужно сохранить содержимое файла в дереве JNDI. Я делаю это, считывая содержимое файла в массив байтов, а затем привязывая его к JNDI следующим образом.

getInitialContext().rebind("customers_datafile", byteArray);

Это работает нормально, но привязка теряется, когда сервер JBoss останавливается/перезапускается. Есть ли способ заставить его сохраняться между перезапусками? В идеале я хотел бы добиться этого без необходимости перепривязывать его, используя код, аналогичный приведенному выше, при каждом перезапуске.


person William    schedule 28.09.2009    source источник
comment
Это очень своеобразное требование, JNDI на самом деле не для этого. Это действительно то, что вы хотите сделать, или есть что-то еще, чего вы пытаетесь достичь, и именно так вы пытаетесь решить эту проблему?   -  person skaffman    schedule 28.09.2009
comment
Смотрите ниже - похоже, мне нужно пересмотреть свою идею :)   -  person William    schedule 28.09.2009


Ответы (1)


Вместо этого используйте фабрику: вместо того, чтобы загружать файл в byteArray, создайте класс, который делает это, и скажите JBoss создать экземпляр. Таким образом, вы можете передать имя файла в конфигурации и загрузить его, когда JBoss запустит new.

Затем вы можете перейти к начальному контексту и запросить класс и вызвать для него метод. В вашем случае метод вернет массив байтов.

См. документы для подробности.

[EDIT] Итак, ваш реальный вопрос заключается в том, как сделать файл доступным для всех узлов кластера JBoss. JBoss не собирается копировать экземпляр, когда вы создаете дополнительные узлы кластера. Все, что он делает, это отправляет копию конфигурации XML узлам. Так что на самом деле ваш единственный вариант - закодировать файл, скажем, в Base64 и поместить его в конфигурацию XML в качестве значения.

Если вы этого не хотите, вы должны найти способ поместить файл в место, где все узлы могут его «видеть». Самое простое решение: загрузить файл на HTTP-сервер и указать URL-адрес в конфигурации. Java может легко считывать данные с URL-адреса, чтобы раздать файл всем узлам.

person Aaron Digulla    schedule 28.09.2009
comment
Моя проблема заключается в том, что такой класс должен будет ссылаться на файловую систему, что, как я предполагаю, может вызвать проблемы, если мы в конечном итоге пойдем по маршруту кластерных серверов JBoss (т.е. к какой файловой системе он будет относиться). Вот почему в идеале я хотел бы просто развернуть его с помощью моей утилиты (вне JBoss), а затем сохранить его в JNDI. - person William; 28.09.2009
comment
Как JBoss собирается распределять ваш byteArray в кластере? - person Aaron Digulla; 28.09.2009
comment
Хорошо, я предполагаю, что дерево JNDI будет общим для кластера? По общему признанию, мои знания по этому вопросу довольно ограничены, поэтому я буду рад, если меня поправят, если что-то, что я говорю, не имеет смысла :) - person William; 28.09.2009
comment
Да, возможно. Но, как вы уже заметили, трудно поместить массив байтов в дерево JNDI таким образом, чтобы он выдержал перезапуск JBoss. - person Aaron Digulla; 28.09.2009
comment
Большое спасибо за ваш вклад, очень признателен. Похоже, один из вариантов, которые вы предложили выше, будет лучшим решением. - person William; 28.09.2009