0

我的团队创建了一个 Web 应用程序,我们希望将它与任务调度程序相关联,如果通过 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 回答