我需要在我的Web应用程序中安排一项任务。该任务需要使用在部署期间初始化的Servlet
的成员字段。我使用了EJB @Schedule
。但是,当任务被触发时,成员字段为空。我猜这是因为我必须将@Stateless
注释添加到servlet中才能使@Schedule
正常工作,而我的Servlet实际上需要保持其状态?EJB @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教程快照说:
企业bean容器的定时器服务使得您为除有状态会话bean以外的所有类型的企业Bean安排定时通知
所以我的结论是,这种方式不适合在Servlet
中使用。
EDIT 2
该servlet是必要的启动的cometd贝叶服务:见here原因。 MyMemberField表示一个包装类的唯一实例,它关注与代理的API(这是一个交易应用程序)的交互。此包装类实例在所有会话和用户中必须是唯一的。我在Servlet的init()
上初始化它。 该包装类向代理发送请求并接收异步答案。也许最好在Bayeux配置器之外定义这个类,但我不知道如何定义它。作为一个servlet?作为一个托管Bean? 最重要的是,我需要与调度程序一起工作才能将预定消息发送给代理。所以,计划任务应该知道代理的包装类实例。