ru_java


ru.java

все о языке программирования java


Previous Entry Share Next Entry
Schedule in servlet
Снайпер
v_y_v wrote in ru_java
Прошу помощи в таком вопросе:
Есть Servlet, при инициализации он запускает таймер timer.schedule(actionclass,...) передавая ему некоторый actionclass, метод run которого и будет запускаться с заданным интервалом.
А вот как их этого Run запустить один из методов самого сервлета, т.е. получить доступ к методам и переменным?

  • 1
Спасибо, думаю в этом направлении и попробую.
Если сервлет выгрузится - то он уже никому не нужен, и следовательно таймер тоже.

Если мне память не изменяет, то контейнер может создавать несколько инстансов одного сервлета, при этом от одного и того же веб клиента один запрос будет обрабатываться одним инстансом, второй -- другим, потом первый инстанс может вообще быть удалён, затем третий запрос опять обработается вторым инстансом, на четвёртый запрос окажется создан четвёртый инстанс....

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

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

"Переменные" остаются общими только если это статические поля. Если это обычные поля -- они свои у каждого инстанса. Грубо говоря статические поля принадлежат самому классу, не статические -- экземпляру класса, который создаётся либо оператором new, либо вызовом clazz.newInstance()

Если "общий массив" не статический, то он доступен только "своему" экземпляру. А у "чужого" экземпляра -- своя копия массива.

> Насколько я понимаю, контейнер создает на каждый вызов сервлета свой экземляр,

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

изменяет. один контейнер содержит один экземпляр сервлета (никогда не видел, чтобы кто-то включал Single-Threaded Model)

  • 1
?

Log in

No account? Create an account