2012-06-15 6 views
0

Я разрабатываю/разрабатываю веб-приложение, которое в конечном итоге будет использоваться как WAR для Tomcat. Одной из особенностей этого приложения будет возможность для пользователей загружать изображения на наш сервер и редактировать их (создавать эскизы и т. Д.). Под капотом мы будем использовать ImageMagick и его библиотеку адаптеров Java IM4Java.Когда в нить и когда ВОЙНА?

Первоначальные прототипы показали, что ImageMagick занимает некоторое время, чтобы «разогреваться» на наших серверах при каждом повторном развертывании приложения. Это побудило нас рассмотреть один из двух вариантов, либо:

  • Создание ImageService.war веб-сервис, который развертывается вместе с первичным приложением и в основном обрабатывает все вызовы IM4Java под капотом (разоблачительные, скажем, RESTful сервис и просто запускает ImageMagick, когда он получает запрос; основное веб-приложение cann может найти отредактированный файл (ы) в той же локальной файловой системе); или
  • Просто создайте Thread подкласс (т.е. ImageServiceThread), пнуть его и запустить его при развёртывании времени, и убедитесь, что он получает закрыли, когда Tomcat отменяет развертывание приложения

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

Наше основное приложение будет единственным пользователем этого «Image Service», в котором я думаю, что отдельная ВОЙНА переполнена и ненужна. Но я никогда не рассматривал потоки внутри Tomcat и не знаю, можно ли порождать и убивать поток, чтобы его жизненный цикл совпадал с его потоком основного/основного приложения.

Какие факторы следует рассматривать как часть такого решения? Заранее спасибо.

+0

Как часто вы ожидаете фактического передислокации в производство? Кажется, что много хлопот обслуживания, чтобы сохранить некоторое раздражение в развитии. – Affe

+0

4-недельные спринты, поэтому ежемесячные выпуски выпуска и обычно 2 - 3 сборки QA для каждого выпуска продукции. – IAmYourFaja

+1

. Как комментарий к вашей последней части, довольно легко порождать нить или подобное и завершать ее в ContextListener - вы почти всегда хотите для управления потоками внутри tomcat в прослушивателе контекста (завершение его в контекстеDestroyed и запуск его в контекстеInitialized методы). Наконец, используйте Исполнителя вместо создания собственных потоков. – nos

ответ

1

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

Это хорошая идея сохранить все, что требуется конкретному webapp, в одном месте: именно поэтому был создан формат WAR, и существуют такие вещи, как ServletContextListener.

Честно говоря, я не уверен, что я потрудился бы «потопить» предварительную загрузку IM вообще - просто запустите некоторую команду образца из ServletContextListener и загрузите ее синхронно.

+0

Итак, если я правильно вас понимаю, вы голосуете в уверенности в отдельном потоке для предварительной загрузки IM, но тот, который все еще находится в той же WAR, что и в моем основном веб-приложении, не так ли? – IAmYourFaja

+0

Я бы сделал это в вашем «главном» webapp, и я бы вообще не стал использовать отдельный поток: просто запустите некоторую простую задачу IM из вашего 'ServletContextListener' и дождитесь ее завершения, прежде чем разрешить веб-приложению в полной мере. –

1

ImageMagick требуется некоторое время, чтобы «разогреть»

лучше, чтобы разгрузить память/ресурсоемкие операции за пределами вашего контейнера сервлетов. Фактически, запустите службу изображений в отдельной JVM.

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

Смежные вопросы