代码之家  ›  专栏  ›  技术社区  ›  Martin

Java/Apache Tomcat Web应用中ServeleSertCistListAgent的恰当使用

  •  1
  • Martin  · 技术社区  · 15 年前

    有人能告诉我是否适合为特定需求使用servletContextListener吗?

    我所拥有的是一个Web应用程序,它每小时运行一个特定的作业来轮询许多RSS提要,并且用户可以随时定义一个新的RSS提要来进行轮询。

    我想避免的是用户在当前的每小时轮询周期中添加一个提要,并将此提要包含在该周期中。

    所以我想的是使用一个带有静态布尔变量的servletContextListener来记录一个轮询周期是否正在运行。如果一个小时轮询周期正在运行,则用户定义的新提要将不会包含在此周期中;如果不运行轮询,则提要可以包含在下一个小时运行中。

    有人能提出建议吗?我看到的唯一替代方法是在数据库表上使用一个标志或更新属性文件中的值(如果可以这样做的话)。

    谢谢

    马丁奥谢。

    3 回复  |  直到 15 年前
        1
  •  2
  •   alphazero    15 年前

    听起来是个坏主意。为什么不简单地使用 ServletContext 您的Web应用程序要保留Web应用程序的属性(“轮询循环运行”)?启动作业的Web应用程序中的组件在上下文中设置属性;当然,所有感兴趣的组件(如addrss操作)都会检查上下文中的属性。

    servletCtx.setAttribute(POLLING_CYCLE_FLAG_ATTR, true);
    

    if(!servletCtx.getAttribute((POLLING_CYCLE_FLAG_ATTR)) {
       // let the user add the feed ...
    }
    

    ServletContextListener 是关于Web应用程序的生命周期和对Web应用程序的更改 ServletContext . 典型的用途是初始化和清理应用程序模块的资源。但基本上,如果你需要密切关注 servletContext , ServletContextListener 是你的朋友。

        2
  •  2
  •   bert    15 年前

    您将提要数据保存在数据库中?不知道如何访问数据库,但是使用普通的JDBC,您可以选择要对结果集进行轮询和迭代的提要。任何新添加的源(在选择之后)都不会显示在此结果集中,因此不会包含在内。

    如果出于某种原因这不适用于您的问题,您可以将这些专长阅读到一个集合中,并使用它。

    还是我完全没有理解你的问题?

        3
  •  0
  •   Sean Owen    15 年前

    同意上一篇文章,即servletContext属性是在servlet API中创建“全局变量”的方法。

    这不适用于servlet容器实例,甚至一个容器中的Web应用程序。每个都有自己的servletcontext。如果您只有一个实例,那么它可以工作。否则我猜你需要一个数据库标志。

    servlet通过init()方法访问servletContext对象。servletContextListeners还可以通过ContextInitialized(servletContextEvent SCE)生命周期事件获得访问权限。我认为投票类作为一个监听器存在是合理的,它以servletContext生命周期开始和停止,是的。初始化后,它将可以访问servletcontext,是的。