プレーンな.javaクラスが1つあります。そのクラスではTimer
、タスクをスケジュールするために、クラススケジュールメソッドを使用しています。
問題は、Java EEアプリケーションを使用していることであり、このクラスをインスタンス化する場所がわかりません。サーブレットまたはそのようなものから?アプリケーションが起動したときに、そのクラスを1回だけインスタンス化したいと思います。
プレーンな.javaクラスが1つあります。そのクラスではTimer
、タスクをスケジュールするために、クラススケジュールメソッドを使用しています。
問題は、Java EEアプリケーションを使用していることであり、このクラスをインスタンス化する場所がわかりません。サーブレットまたはそのようなものから?アプリケーションが起動したときに、そのクラスを1回だけインスタンス化したいと思います。
おそらくServletContextListener
とそのメソッドが必要contextInitialized(..)
です。アプリケーションが初期化されるときに一度呼び出されます。
リスナーをweb.xmlのいずれか@WebListener
またはでマップします<listener><listener-class>..</...>
public class YourServlet extends HttpServlet {
private YourClass instance;
public void init() throws ServletException {
instance = new YourClass();
}
//code
}
initメソッドでクラスをインスタンス化することにより、クラスが1回だけインスタンス化されるようになります。これは、Java EEアプリケーションでは、サーブレットがサーバーメモリに1回だけロードされるためです。
Quartz(一般的なスケジューラー)では、load-on-startup属性をtrueに設定してサーブレットのinitメソッドでジョブを構成するのが一般的な方法です。
この記事から、web.xmlで次のことを行う必要があります。
<servlet>
<servlet-name>QuartzInitializer</servlet-name>
<display-name>Quartz Initializer Servlet</display-name>
<servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
次に、サーブレットでジョブを構成します。
public class QuartzServlet extends GenericServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
// And continue with your configuration
PS:クォーツを使用することを強くお勧めします