Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Объекты, локальные в потоке / 25 сообщений из 35, страница 1 из 2
13.09.2014, 06:35
    #38745821
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Развлекаюсь с сервлетами, делаю ритуальное:
Код: sql
1.
2.
3.
4.
5.
public class Баклуша extends HttpServlet {
  @Override
  protected void service(HttpServletRequest request, HttpServletResponse)
  throws IOException, ServletException
  { /* Бьём баклушу */ }

и понимаю, что получается портянка с большим количеством похожих кусков.
Начинаю разносить похожие куски по отдельным методам и получается, что каждому надо передавать более-менее значительное число параметров, чтобы учесть различия похожих кусков.
Задумываюсь и понимаю, что должен помочь класс-обёртка, который назовём "капсулой".
Экземпляр капсулы будет создаваться внутри service(), хранить состояние всего, что мне нужно, а методы капсулы будут напрямую работать с переменными экземпляра.

Как пример - протоколирование.
Я должен или собирать строку каждый раз, когда требуется log.debug(сообщение), что громоздко или передавать адрес клиента, текстовую строку, идентифицирующую стадию обработки, размер прочитанных/записанных данных, время, потраченное на обработку и т.п. в отдельный метод, что чуть компактнее, но всё равно коряво.
С классом-обёрткой будет что-то вроде logPhase1() и т.п.
Разумеется, класс-обёртка всё равно получится достаточно большим - портянка есть портянка и весь вопрос: "куда её прятать?".

"Внимание, вопрос!".
С учётом того, что ява хорошо справляется с большим количеством короткоживущих объектов, выглядит неплохо, но может быть я изобретаю велосипед и "есть способ лучше"?

P.S. Про ThreadLocal - в курсе, но это (всего лишь) способ хранения капсулы со своими плюсами и минусами.
То, что такой способ может привести к утечке ресурсов - тоже понимаю.
...
Рейтинг: 0 / 0
13.09.2014, 10:05
    #38745837
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Singleton не рассматривал?
в нем сохранять все параметры, а каждый метод будет извлекать только нужные ему параметры?
...
Рейтинг: 0 / 0
13.09.2014, 11:20
    #38745854
scf
scf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Есть - IoC контейнеры
Guice или даже Spring Framework.
...
Рейтинг: 0 / 0
13.09.2014, 12:12
    #38745862
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
вадяSingleton не рассматривал?
в нем сохранять все параметры, а каждый метод будет извлекать только нужные ему параметры?Singleton не годится в принципе - у каждого запроса своё состояние и одновременно может (и будет) обрабатываться несколько запросов.
...
Рейтинг: 0 / 0
13.09.2014, 12:14
    #38745864
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
scfЕсть - IoC контейнеры
Guice или даже Spring Framework.Подключение Spring-a, чтобы (несколько) упростить пятикилобайтный класс - некий оверкил, но, может быть, я чего-то не понимаю?
Можно более расширительно?
...
Рейтинг: 0 / 0
13.09.2014, 12:20
    #38745866
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Basil A. SidorovвадяSingleton не рассматривал?
в нем сохранять все параметры, а каждый метод будет извлекать только нужные ему параметры?Singleton не годится в принципе - у каждого запроса своё состояние и одновременно может (и будет) обрабатываться несколько запросов.
если нужно состояние, то его выдялют в некий объект ВНЕ сервлета и БЛ-сервисов и хранять в сессии.
Уж такая парадигма(
А сам сервлет - процедурное программирование.
...
Рейтинг: 0 / 0
13.09.2014, 12:23
    #38745868
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Basil A. Sidorovlog.debug(сообщение)
подробнее.
Время там есть, имя класса есть, уровни есть....
...
Рейтинг: 0 / 0
13.09.2014, 12:37
    #38745871
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Petro123если нужно состояние, то его выдялют в некий объект ВНЕ сервлета и БЛ-сервисов и хранять в сессииИменно так оно и есть - отдельный объект, экземпляр которого создаётся внутри service().
В данном конкретном случае всё полностью sessionless, хотя (недавно) клиент и научился работать с сессиями.А сам сервлет - процедурное программирование.Вот поэтому и хочется состояния.
...
Рейтинг: 0 / 0
13.09.2014, 12:51
    #38745880
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Basil A. Sidorov,
imho
из треда не видно, что ты делаешь "стандартную корзину покупателей"....и в чём вопрос?
- состояние делается инжекцией объекта Корзина из сессии.
...
Рейтинг: 0 / 0
13.09.2014, 12:52
    #38745881
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Basil A. Sidorov,
я сам хотел бы посмотреть пример этого из прошлого века. Но без спринга))
...
Рейтинг: 0 / 0
13.09.2014, 12:57
    #38745882
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Petro123из треда не видно, что ты делаешь "стандартную корзину покупателей"Боже упаси. Ничего близкого к интернет-магазину, витрине, каталогу, e.t.c.....и в чём вопрос?Вопрос в корректности подхода к хранению состояния http-запроса.состояние делается инжекцией объекта Корзина из сессии.Нет сессий, нет. И бизнес-логики нет.
Голый транспорт, который надо обработать и запротоколировать эту обработку.
...
Рейтинг: 0 / 0
13.09.2014, 13:10
    #38745887
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
авторНет сессий, нет. И бизнес-логики нет.
Голый транспорт, который надо обработать и запротоколировать эту обработку.
а более подробно о проекте?
возможно и другое решение..
...
Рейтинг: 0 / 0
13.09.2014, 13:21
    #38745893
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Petro123подробнее.
Время там есть, имя класса есть, уровни есть....
Код: sql
1.
2.
3.
4.
5.
6.
7.
try {
  byte[] buffer = new byte[request.getContentLength()];
  ServletInputStream in = request.getInputStream();
  in.read( buffer );
  in.close();
}
catch ( IOExceptin ex ) {}

Вроде тривиально, но добавляем логирование:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
...
  in.close();
  if (log.isDebugEnabled) {
    StringBuilder msg = new StringBuilder(100);
    msg.append(request.getRemoteAddr())
       .append(": read ")
       .append(request.getContentLength())
       .append(" byte(s)");
    log.debug(msg);
  }
  catch (IOException ex) {
    StringBuilder msg = new StringBuilder(100);
    msg.append(request.getRemoteAddr())
         .append(": error read ")
         .append(request.getContentLength())
         .append(" byte(s) - ")
         .append(ex.getMessage());
    log.warn(msg);
  }

Если копипастить такой код в разные места, то это не только коряво и увеличивает размер класса на ровном месте, но и "разбавляет" основную логику, затрудняя чтение и понимание.
И это ещё не рассматривается отслеживание времени обработки и увеличение детализации обработки - отслеживание числа фактически прочитанных байт или/и ведение трассировки.
Если вынести в отдельные методы внутри сервлета, то им придётся передать кучу параметров.
...
Рейтинг: 0 / 0
13.09.2014, 13:31
    #38745898
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Basil A. Sidorov,
логирование к состоянию никак не относится.
- убрать isDebug - есть уровни - разные методы для этого у логировщика
- логирование должно быть одной строкой. Либо утилитная процедура по ООП либо доп.метод в логировщике с передачей только объекта логирования.
...
Рейтинг: 0 / 0
13.09.2014, 13:32
    #38745900
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Basil A. SidorovЕсли вынести в отдельные методы внутри сервлета, то им придётся передать кучу параметров.
да. За это я не люблю Java (нет подпроцедур).
Но есть способы выше.
...
Рейтинг: 0 / 0
13.09.2014, 13:40
    #38745901
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
я делаю так:
Код: java
1.
2.
3.
4.
5.
6.
7.
		// все проверки
		if НеПрошлаПроверкуВходныхПараметров (request) {
			response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
			response.flushBuffer();
			log.error("Errr - POST ЧЧЧЧЧЧЧЧЧЧЧЧ");
			return;
		}


в самом начале сервлета
...
Рейтинг: 0 / 0
13.09.2014, 13:47
    #38745902
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
вадяа более подробно о проекте?
возможно и другое решение..Из http-запроса достаётся (возможно упакованный) массив байтов, отправляется на сервер приложений и ответный массив байтов возвращается http-клиенту.
Входящий запрос контролируется на минимальный и максимальный размер, распакованное задание контролируется на максимальный размер.
Если ответ сервера приложений не упакован - упаковываем перед отправкой клиенту, если размер ответа превышает два килобайта.
Чтение запроса, отправка задания серверу приложений и запись ответа протоколируются в отладочном режиме.
Обрабатываются ситуации:
1. Контейнер сворачивает (undeploy) контекст - по возможности возвращаем ошибку клиенту, протоколируем информационное сообщение в методе destroy и отладочное сообщения в методе service;
2. Запрос не прошёл контроль - по возможности возвращаем ошибку клиенту и протоколируем отладочное сообщение;
3. Ошибка чтения запроса - прерываем обработку и протоколируем предупреждение;
4. Ошибка обмена с сервером приложений - возвращаем ошибку клиенту и протоколируем предупреждение;
5. Ошибка записи ответа - протоколируем предупреждение.
За обмен с сервером приложений отвечает отдельный (готовый) класс, потроха которого нас не интересуют.
...
Рейтинг: 0 / 0
13.09.2014, 13:52
    #38745909
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Petro123я делаю так:
...
в самом начале сервлетаЭто годится только для самого примитивного случая - проинформировать, что "шитхэппенед".
При разборе проблем извлечь из такого сообщения полезную информацию невозможно.

P.S. А количество "строк на событие" определяется исключительно желаемой или требуемой детальность: трассировка с лёгкость может создать десятки и даже сотни строк на каждое событие.
...
Рейтинг: 0 / 0
13.09.2014, 13:55
    #38745912
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Basil A. SidorovЭто годится только для самого примитивного случая - проинформировать, что "шитхэппенед".
При разборе проблем извлечь из такого сообщения полезную информацию невозможно.
ты не понял. Там внутри логировщик тоже.
ООП же, хоть и в процедурном программировании без состояния.
...
Рейтинг: 0 / 0
13.09.2014, 13:57
    #38745915
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
т.е. если тебя DOC'ят, то входные неверные - нужно выходить из обработки как можно быстрее.
Дальше работает БЛ спокойно.
...
Рейтинг: 0 / 0
13.09.2014, 13:59
    #38745916
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Petro123ты не понял. Там внутри логировщик тоже.
ООП же, хоть и в процедурном программировании без состояния.Я понял, но в лог-файле нет ни логгеров ни ООП - только текстовые строки.
А мне хочется сделать протоколирование на качественном уровне. Тем более, что и пример есть - DrWeb Enterprise Suite
...
Рейтинг: 0 / 0
13.09.2014, 14:00
    #38745917
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
по задаче.
Т.к. у тебя нет сессий, т.е. нет и состояния. Весь поток ты принимаешь за раз. И обрабатываешь за один реквест.
Тебе хранить между реквестами нечего.
...
Рейтинг: 0 / 0
13.09.2014, 14:01
    #38745918
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Petro123т.е. если тебя DOC'ят, то входные неверные - нужно выходить из обработки как можно быстрееИ это понятно. Просто в моём случае нет никаких особых признаков атаки, поэтому используется простейший контроль по априорным параметрам.
...
Рейтинг: 0 / 0
13.09.2014, 14:03
    #38745921
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
а откуда приходят http-запросы?
т.е. тебе надо организовать только одно звено?
...
Рейтинг: 0 / 0
13.09.2014, 14:04
    #38745922
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объекты, локальные в потоке
Petro123по задаче.
Т.к. у тебя нет сессий, т.е. нет и состояния. Весь поток ты принимаешь за раз. И обрабатываешь за один реквест.
Тебе хранить между реквестами нечего.Мне и не нужно хранить между запросами. Нужно хранить внутри запроса, т.к. он разбивается на логические фазы. Причём эти фазы мельче "технически необходимых".

P.S. В принципе, можно закругляться: принципиальных возражений я не вижу, остальное - детали реализации, которые виднее именно мне
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Объекты, локальные в потоке / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]