【问题标题】:Design for running of Service during Server startup in JavaJava中Server启动时Service运行的设计
【发布时间】:2012-12-01 02:32:00
【问题描述】:

我想启动一个服务,它与服务器一起启动,直到服务器被杀死才结束。 所以首先我使用了 ServletContextListner 类,我在其中实现了我的逻辑部分以使用

运行该方法
while(true){ 
    try{ // do the jobs } 
    catch(Exception e){} 
}

但后来我觉得在 Listener 课上执行这项工作并不好。 然后我转移到一个 ServiceManager 类并做同样的工作,但让我在使用 Spring 注入属性方面具有优势,这在 Listener 类中是不可能的。

但是关于如何更好/从哪里调用这个类并调用无限运行的 startService 方法的基本问题。

public void contextInitialized(ServletContextEvent event) {
        logger.info(" *** START MyListener ****");
        context = event.getServletContext();
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
        MyServiceManager serviceManager = (MyServiceManager) ctx.getBean("myServiceManager");
        serviceManager.startService();
        logger.info(" *** END MyListener ****");
    }

或任何想法如何调用/实现此类服务以在没有任何抽象的情况下永远在服务器中运行 [在任何情况下,除非服务器停止,否则不应将其终止]

【问题讨论】:

  • 有什么问题?使用 ServletListener 的 contextInitialized 启动和 contextDestroyed 停止服务应该可以解决问题。 “没有任何抽象”是什么意思?
  • 怎么样 1. 创建一个 Servlet 并将您的服务代码放入 init 方法 2. 在 web.xml 中将其配置为启动 servlet
  • 我认为问题是,服务器没有完成启动,直到控件脱离 contextInitialized 方法。因为,一切都运行良好,并且 startService 方法按预期永远运行。但是Tomcat在服务器启动时间结束后抛出错误。

标签: java design-patterns servlet-listeners


【解决方案1】:

您是否愿意接受替代技术,即 Node.js ?

我不确定你的服务器是做什么的,但是我必须为 iOS 构建一个“永远在线”的推送通知服务器,并且我使用 Node.js 来做到这一点。

如果是,您可以这样构建系统:

构建系统

1) 当您的 Java 服务器接收到 HTTP Web 请求(POST 请求)时,您使用 Java 设置 Web 服务以将 JSON 数据返回到您的 Node.js 服务器

2) 您的 Node.js 向您的 Java 服务器发出 POST 请求,获取结果并对其进行解析并将其发送到您的其他系统

具有容错能力的永远在线服务器

安装 Node.js 后,您可以使用 Node.js 的 NPM(Node.js 包管理器)安装 Forever 工具。

然后使用 Forever 工具,你可以去:

forever start server.js

要启动具有自动容错功能的无限进程,您还可以列出永久工具当前管理的守护程序作业:

forever list

注意:你不需要在 Node.js 中使用无限 while 循环,当你启动一个 Node.js http 服务器时,它会一直运行直到你告诉它停止。

当您的服务器启动、重新启动、断电或其他任何情况时,Forever 将自动生成一个新进程,从而为您提供自动容错能力。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    这是一个重复的问题,请参阅: Background process in Servlet

    所以你可以做那个答案中解释的事情,如果你需要然后使用applicationContext.getBean("yourBean");加载你的Spring配置bean

    【讨论】:

    • 但就我而言,我只需要确保该线程永远不会被杀死并永远运行,或者除非服务器停止,否则永远不会进入任何状态(死)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2011-08-24
    • 2019-03-21
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 2017-03-25
    相关资源
    最近更新 更多