одноэлементное действие struts

#multithreading #struts

#многопоточность #struts

Вопрос:

Почему класс действия struts является одноэлементным ?

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

Это какой — нибудь способ удалить singleton из класса action?

для получения дополнительной информации, пожалуйста, посетите: http://rameshsengani.in

Ответ №1:

Вы спрашиваете о том, почему класс Action является одноэлементным, но я думаю, что у вас также есть некоторые проблемы с пониманием потокобезопасности, поэтому я попытаюсь объяснить и то, и другое.

Прежде всего, класс Struts Action не реализован как синглтон, фреймворк просто использует один его экземпляр. Но поскольку для обработки всех входящих запросов используется только один экземпляр, необходимо соблюдать осторожность, чтобы не делать с классом Action чего-либо, что не является потокобезопасным. Но дело вот в чем: по умолчанию классы действий Struts не являются потокобезопасными.

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

Из класса действий JavaDoc:

Действия должны быть запрограммированы потокобезопасным образом, поскольку контроллер будет совместно использовать один и тот же экземпляр для нескольких одновременных запросов. Это означает, что при проектировании следует учитывать следующие элементы:

  • Экземпляр и статические переменные НЕ ДОЛЖНЫ использоваться для хранения информации, относящейся к состоянию конкретного запроса. Они МОГУТ использоваться для совместного использования глобальных ресурсов между запросами на одно и то же действие.

  • Доступ к другим ресурсам (JavaBeans, переменным сеанса и т.д.) Должен быть синхронизирован, если эти ресурсы требуют защиты. (Однако, как правило, классы ресурсов должны быть спроектированы таким образом, чтобы при необходимости обеспечивать свою собственную защиту.

Вы используете действие Struts, извлекая его и создавая свое собственное. Когда вы делаете это, вы должны позаботиться о соблюдении правил, приведенных выше. Это означает, что что-то подобное НЕ:

 public class MyAction extends Action {
   private Object someInstanceField;
   public ActionForward execute(...) {
      // modify someInstanceField here without proper synchronization ->> BAD
   }
}
  

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

Этот метод получает все, что ему нужно, в качестве параметров. У вас может быть тысяча потоков, выполняемых одновременно в execute методе без проблем, потому что у каждого потока есть свой собственный стек выполнения для вызова метода, но не для данных, которые находятся в куче (например someInstanceField ), которая является общей для всех потоков.

Без надлежащей синхронизации при изменении someInstanceField все потоки будут поступать с ним так, как им заблагорассудится.

Итак, классы действий Struts 1 не являются потокобезопасными, но это в том смысле, что вы не можете безопасно сохранять в них состояние (т. Е. выполнять их по состоянию), или, если вы это делаете, это должно быть правильно синхронизировано.

Но если вы сохраняете реализацию класса Action без состояния, все в порядке, синхронизация не требуется, и потоки не ожидают друг друга.

Почему класс struts action является одноэлементным?

Это сделано специально. И снова JavaDoc объясняет это:

Действие является адаптером между содержимым входящего HTTP-запроса и соответствующей бизнес-логикой, которая должна быть выполнена для обработки этого запроса

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

Поскольку преобразование веб-объектов в объекты модели (и я не имею в виду здесь компоненты ActionForm) должно быть основной целью классов действий, им не нужно поддерживать какое-либо состояние (и не должно быть), а также, нет причин иметь больше экземпляров этих ребят, все делающих одно и то же. Достаточно всего одного.

Если вы хотите, вы можете безопасно поддерживать состояние в своей модели, например, сохраняя информацию в базе данных, или вы можете поддерживать веб-состояние с помощью http-сеанса. Неправильно поддерживать состояние в классах действий, поскольку это приводит к необходимости синхронизации, как объяснено выше.

Есть ли способ удалить singleton из класса action?

Я думаю, вы могли бы расширить Struts и переопределить поведение по умолчанию RequestProcessor.processActionCreate, чтобы самостоятельно создавать действие для каждого запроса, но это означает добавление другого слоя поверх Struts, чтобы изменить его «нормальное» поведение. Я уже видел, как подобные вещи выходят из строя в нескольких приложениях, поэтому я бы не рекомендовал это.

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

Если ваше приложение новое и вам абсолютно необходимы действия с полным состоянием, я думаю, вы могли бы выбрать Struts 2 (они изменили дизайн там, и экземпляры Action теперь по одному на запрос). Но Struts 2 сильно отличается от Struts 1, поэтому, если ваше приложение старое, может быть сложно перейти на Struts 2.

Надеюсь, теперь это проясняет.

Ответ №2:

Это изменилось в Struts2 http://struts.apache.org/release/2.1.x/docs/comparing-struts-1-and-2.html

* Объекты Struts 2 Action создаются для каждого запроса, поэтому проблем с безопасностью потоков нет. (На практике контейнеры сервлетов генерируют много одноразовых объектов за запрос, и еще один объект не налагает штрафа за производительность и не влияет на сборку мусора.) *

Ответ №3:

Я мало что знаю о struts, но, похоже, это изменилось в Struts 2, так что, возможно, вам следует переключиться на Struts 2?

Комментарии:

1. Спасибо за ваше предложение… Я понял