我需要在我的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? 最重要的是,我需要與調度程序一起工作才能將預定消息發送給代理。所以,計劃任務應該知道代理的包裝類實例。