0

私のチームは、Web アプリケーションを介して実行されているプロジェクトのいずれかがスケジュールより遅れて実行されている場合に、1 日に 1 回電子メールを送信するタスク スケジューラに関連付けたいと考えている Web アプリケーションを作成しました。

私たちが使用しているスケジューラ ライブラリ Cron4j は十分に単純であり、現時点では、次のような一連の Web サービス コールを通じて管理しようとしています (スケジューラを開始して実行するというアイデアです)。指定された時間または停止するまで):

public SchedulerResource(){
    s = new Scheduler();
}

@GET
@Path("start")
@Produces(MediaType.APPLICATION_JSON)
public Response invoke_workback_communicator() throws MalformedURLException   { 
    s.schedule("* * * * *", new Runnable() {
        public void run() { 
            WorkbackCommunicator communicator = new WorkbackCommunicator();
            communicator.run();
        }
    });

    s.start();

    try {
        Thread.sleep(1000L * 60L * 2L);
    } catch (InterruptedException e) {
        ;
    }
    s.stop();

    return Response.noContent().build();
}   

@GET
@Path("stop")
@Produces(MediaType.APPLICATION_JSON)
public Response stop_workback_communicator() throws MalformedURLException { 
    s.stop();
    return Response.noContent().build();
}

現時点では、'invoke_workback' メソッドは正常に機能しますが、'stop_workback' メソッドは機能しません。

私が興味があるのは:

  • この悪い習慣のように、Web サービスでスケジューラを呼び出していますか?
  • もしそうなら、どうすればこの機能を効果的に達成できますか?
  • そうでない場合、スケジューラ インスタンスを管理するサービス インターフェイスを作成するにはどうすればよいですか? これも必要ですか?

編集:

問題をさらに調べたところ、サーバーの起動およびシャットダウン時にスケジューラを起動または強制終了するために使用できる「ServletContextListener」と呼ばれるものがあることに気付きました。この時点で私が考えているのは、その機能をテストし、アプリがまだ実行されているときにスケジューラを管理できるようにするサービスを維持することです。

4

1 に答える 1

0

私はまだこのトピックに関するいくつかの外部の視点に興味がありますが、かなりうまく機能するように見える解決策を見つけました. 私たちが行ったのは、サーバーの起動時にコンテキストの開始時にスケジューラを開始し、サーバーの停止時にコンテキストの破棄時にスケジューラを停止する「ServletContextListener」を実装することでした。

プロジェクトの WEB-INF フォルダーにある web.xml ファイルに、リスナーをエントリとして追加する必要がありました。

<listener>
    <listener-class>com.mmm.marketing.utils.SchedulerServletContextListener</listener-class>
</listener>

また、必要に応じてスケジューラ シングルトンを手動で停止および開始できる Web サービスも作成しました。

于 2015-07-09T19:45:07.980 に答える