Экземпляры области применения Struts2 - PullRequest
0 голосов
/ 09 ноября 2018

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

public class ExampleClass {
    public ExampleClass(){//Read files and stuff to initialize}
    public Object method(Object[] args){//The job to do}
}

И затем, в действии распорок, которое использует его, он создает его следующим образом:

public class SomeAction extends ActionSupport {
    ExampleClass example = new ExampleClass()
    public String execute() {
        //Do stuff every time the action is called
        Object result = example.method(args);
        // Do stuff with results
    }
}

Я знаю из времен сервлетов, что это делает свое дело, однако я чувствую, что парень, который занимался этим раньше, был таким же неопытным в Struts2, как и я, поэтому вот мой вопрос:

Это правильный способ сделать это в соответствии со стилевыми рекомендациями и лучшими практиками? Предоставляет ли struts2 более контролируемый способ сделать это?

Я нашел здесь несколько ответов, связанных с простыми параметрами, но я не уверен, что это правильный путь для таких объектов? Что произойдет, если экземпляр ExampleClass действительно тяжелый? Я не хочу, чтобы они копировались вокруг:

Как установить значение в области приложения в struts2?

Некоторые сведения о ExampleClass : Когда вызывается конструктор, он читает большие наборы файлов и извлекает из них свои конфигурации, создавая сложные внутренние представления. Когда вызывается метод (), он анализирует свои параметры с использованием правил и выводит результаты пользователю. Этот процесс обычно занимает несколько секунд и не изменяет ранее инициализированные значения правила.

Это выполняется в Tomcat 7, однако я планирую перейти на Tomcat 8.5, когда все будет готово. Я хотел бы знать, существуют ли известные проблемы, связанные с этой настройкой, а также (в коде нет других несовместимостей).

Кстати: он не проверяет, не сломан ли ExampleClass или что-то в этом роде, это определенно похоже на рецепт катастрофы xD. Фактически, если я удаляю исходные файлы, он все еще пытается выполнить метод () ... Бедная душа ...

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

Если Struts2 не поддерживает это, то какой метод является общепринятым? Может быть, какой-нибудь перехватчик, чтобы проверить состояние объекта и вернуться на страницу ошибки, если он не был правильно создан? Выполнить частичную остановку кота изнутри?

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

Прямо сейчас я могу вручную выполнить что-то вроде:

public class SomeAction extends ActionSupport {
    ExampleClass example = new ExampleClass();
    private boolean otherIsBuildingExample = false;
    public String execute() {
        if(otherIsBuildingExample) return '500 error';
        if(example==null || example.isBroken()){
            otherIsBuildingExample = true;
            example = new ExampleClass();
            otherIsBuildingExample = false;
        }
        Object result = example.method(args);
        // Do stuff with results
    }
}

Действительно, это было бы чище с перехватчиками, или около того, однако, это звучит как боль в *** для параллелизма, особенно принимая во внимание, что для запуска этого примера требуется несколько секунд, и что может поступить больше запросов, поэтому другие вопросы, которые следует принять во внимание, например: что если два человека вызывают if (otherIsBuildingExample), а второй получает значение до того, как первый выполнит otherIsBuildingExample = true? Ничего хорошего ... Если класс достаточно прост, оба экземпляра будут созданы, и более медленный будет преобладать, но если один экземпляр блокирует ресурсы другого ... ну, больше проблем.

Единственное чистое решение, которое я могу придумать, - это сделать ExampleClass достаточно надежным, чтобы вы могли восстановить его, используя его собственные методы (не повторное создание), и сделать эти потоки безопасными обычным способом (если 10 человек пытаются восстановить его, только один будет продолжаться, в то время как другие просто ждут, пока завершится первый, например).

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

копаюсь в стойках документации Заранее спасибо.

...