Можем ли мы каждый раз создавать новый экземпляр для классов действий Struts 1.x? - PullRequest
1 голос
/ 09 ноября 2011

Классы действий Struts 1.x по своей природе не являются поточно-ориентированными, так как Struts кэширует классы действий и использует их для других запросов.

Есть ли способ настроить классы действий Strux 1.x таким образом, чтобы каждый раз создавался новый экземпляр класса действий?

Если это возможно, есть ли недостатки в этом?

Ответы [ 2 ]

3 голосов
/ 09 ноября 2011

В конечном счете, конечно, ответ «да»: вы можете получить полный исходный код для Struts 1 и превратить его в нечто, чем оно не было предназначено.

Стоит ли вам? Почти наверняка нет. Если вы решили предпринять это, начните с RequestProcessor.processActionCreate.

Я с Брэдом, но было бы немного сильнее: то, что ты собираешься сделать, это плохая идея. Используйте контекст сеанса, контекст приложения, локальные потоки, синхронизацию и т. Д., Как предполагалось использовать каркас.

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

IMO, было бы более эффективно использовать структуру, как задумано. Какую проблему ты пытаешься решить? Вероятно, есть лучшее решение, для которого не понадобится хотя бы полный цикл выпуска, чтобы проверить функциональность модифицированного фреймворка.

0 голосов
/ 09 ноября 2011

Не делай этого. Как вы сказали, они не безопасны для потоков.

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

Если вы пытаетесь сохранить некоторые данные только для каждого отдельного запроса и не хотите или не можете использовать HTTP_SESSION, вы можете посмотреть на использование ThreadLocal

...