Мне нужно запланировать задачу в моем веб-приложении.Задача должна использовать поле члена Servlet
, которое инициализируется во время развертывания.Я использовал EJB @Schedule
.Однако, когда задача запускается, поле члена имеет значение null.Я предполагаю, что причина заключается в том, что мне пришлось добавить аннотацию @Stateless
к сервлету, чтобы заставить @Schedule
работать, и мой сервлет должен действительно сохранить свое состояние?
Если даКак я могу выполнить свою задачу простым и эффективным способом?Использование GlassFish 3
Вот снимок моего кода
@Stateless // <-- Wrong ??
public class myServlet extends GenericServlet {
private MemberField myMemberField = new MemberField();
@Override
public void init() throws ServletException {
myMemberField.initialize();
}
@Schedule(dayOfWeek = "Mon-Fri", hour = "21", minute = "59", second = "55")
public void myTask() {
System.out.println(myMemberField.toString());
}
// other stuff
}
РЕДАКТИРОВАТЬ
В руководстве по Java EE написано:
Служба таймера контейнера EJB позволяет планировать уведомления по расписанию для всех типов EJB, за исключением сеансовых EJB с состоянием
. Поэтому я пришел к выводу, что этот способ не подходит для использования в Servlet
.
EDIT 2
Сервлет необходим для запуска службы CometD Bayeux: см. здесь почему.MyMemberField представляет уникальный экземпляр класса-оболочки, который заботится о взаимодействии с API брокера (это торговое приложение).Этот экземпляр класса-оболочки должен быть уникальным для всех сеансов и пользователей.Я инициализирую его на init()
сервлета.Этот класс-оболочка отправляет запросы брокеру и получает асинхронные ответы.Может быть, лучше определить этот класс за пределами конфигуратора Bayeux, но я не знаю, как его определить.Как сервлет?Как управляемый боб?Кроме того, мне нужно работать с планировщиком, чтобы отправлять запланированные сообщения посреднику.Таким образом, запланированное задание должно знать о экземпляре класса-посредника брокера.