Java EE, EJBs Обработка файлов - PullRequest
3 голосов
/ 13 марта 2011

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

Моя проблема заключается в том, что EJB-компоненты могут быть распределены на нескольких серверах, и поэтому им не разрешено обрабатывать файлы напрямую. Я мог хранить изображения в базах данных, но я надеялся сохранить их в виде файлов на одном из серверов. Как я могу это сделать? Есть ли способ централизовать хранение файлов? Или есть какой-нибудь подход к работе с файлами в Java EE с помощью EJB?


В настоящее время я храню свои файлы в базе данных. Таким образом, у меня есть централизованный доступ, и мне не нужен выделенный файловый сервер. Я делаю это, потому что я не знаю, как интегрировать FTP-серверы и EJB. Это хорошая альтернатива?

То, что я хочу: используя EJB без сохранения состояния, сохраняйте загруженные изображения в виде файлов и путь к ним в базе данных. Так что я могу отобразить их, используя

<h:graphicImage ... />

Ответы [ 6 ]

5 голосов
/ 29 марта 2011

У вас здесь есть четыре аспекта,

  1. Прием и отправка файлов
  2. Создание миниатюр
  3. Хранение файлов там, где каждый узел может получить доступ
  4. Хранение исходных + миниатюрных объектов в общей базе данных

Поскольку у вас уже есть сервер Java EE, у вас, вероятно, также есть сервер сервлетов (HTTP), в котором существует множество способов балансировки нагрузки и кэширование , не говоря уже о явном потенциале для веба. взаимодействие на основе Во всяком случае, поддержка FTP-передачи с наблюдателем каталога в качестве бонуса.

Вы не должны создавать миниатюры, используя сессионные компоненты без сохранения состояния, это означает, что ваши серверы будут дремать в пиковое время - сервер будет отдавать приоритет логике бизнеса над установлением новых соединений. Вместо этого сначала получите и сохраните файл + исходный объект в базе данных, а затем используйте служебный компонент, чтобы поставить в очередь создание миниатюр (возможно, с n рабочими потоками или очередями сообщений, если хотите). Вы также можете использовать нативные инструменты, в некоторых случаях мы используем Linux.

Вам следует использовать общую файловую систему SAN, которая является подходящим инструментом для обмена файлами между несколькими компьютерами. И структурируйте свои файлы в соответствии с ограничениями вашей файловой системы - такими как количество файлов в каталоге и емкость для чтения / записи.

И одной базы данных будет достаточно для хотя бы небольшого кластера, если вы не убиваете ее большими двоичными двоичными объектами.

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

1 голос
/ 29 марта 2011

Вы можете:

  1. Создать общий файловый ресурс на основе WebDAV.Это можно сделать с помощью множества библиотек, доступных для Java или других языков.Одна из таких библиотек: http://milton.ettrema.com/index.html
  2. Все экземпляры EJB могут читать / записывать изображения из этого общего файлового ресурса.Им нужно будет использовать клиентские библиотеки WebDav
  3. DO настроить резервные копии каталогов за этой общей папкой
1 голос
/ 28 марта 2011

Я бы посоветовал вам придерживаться вашего текущего решения.Ftp-доступ (если это необходимо для других целей, а не только для хранения файлов) может быть создан поверх слоя ejb.Отображение изображений, хранящихся в БД, не является проблемой, простой сервлет поможет.

1 голос
/ 28 марта 2011

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

Возможный способ сделать это - http://txconnect.sourceforge.net/ JCATransaction Adapter, который передает (среди прочего) FTP-соединения.Сконфигурируйте фабрику в xml и вставьте соединение в ваш bean-компонент, и вы готовы к работе.

В зависимости от вашего сервера приложений может быть доступен специальный соединитель (например, системы Oracle или IBM)

1 голос
/ 28 марта 2011

Вы также можете использовать кластерную файловую систему . Глобальная файловая система RedHat и Кластерная файловая система Symantec Veritas - это два моих опыта работы.Эти продукты позволяют монтировать одну и ту же файловую систему на нескольких серверах для доступа на чтение / запись.Все, что видит ваше приложение - это просто еще один каталог.Если в вашей среде уже есть необходимые компоненты (SAN и хороший Sys Admin), это может быть наиболее эффективным решением во многих случаях использования.

Однако у этого подхода есть недостатки:

  1. Вы переносите сложность из своего приложения в ОС.Эти продукты не просты в настройке.
  2. Масштабируемость может стать проблемой, если у вас большая ферма серверов.И когда возникают проблемы с масштабированием, обнаружение узкого места не так просто, как решение ftp от Арджана.
  3. Вам нужен SAN.
1 голос
/ 13 марта 2011

Вы можете использовать для этого (частный) FTP-сервер. Ваши EJB-компоненты могут обращаться к этому серверу для хранения и извлечения файлов.

В Java существуют различные библиотеки для доступа к FTP-серверам. Конкретно хорошо подходят для использования в среде EJB будут FTP-коннекторы на основе JCA, но «нормальные» обычно тоже будут работать нормально.

...