3

我想启动一个与服务器一起启动的服务,直到服务器被杀死才结束。所以首先我使用了 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 ****");
    }

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

4

2 回答 2

1

这是一个重复的问题,请参阅: Servlet 中的后台进程

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

于 2012-12-13T08:56:01.967 回答
0

您是否愿意接受替代技术,即 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 工具管理的守护程序作业:

forever list

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

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

希望有帮助。

于 2012-12-13T08:53:13.733 回答