2011-04-09 89 views
2

如果我错误地描述了这个,你将不得不原谅我,但实际上我试图让服务类的类只在服务器启动时实例化一次,在后台直到它在服务器停止时被杀死。至少从我所知道的情况来看,这与典型的servlet不完全相同(尽管我可能对此有错)。更重要的是,我还需要能够在线后访问此服务/对象。java ee后台服务

作为一个例子,在我所研究的另一个项目中,我们使用Spring框架来完成类似的事情。本质上,我们使用配置XML文件和内置的注释让Spring知道实例化一些我们的服务的实例。稍后,我们使用注释@Autowired来“抓取”这个预先实例化的服务/对象的对象引用。所以,尽管它看起来可能与Java本身的一些主要概念有所不同,但我只是想弄清楚如何在这里重新发明这个轮子。我想有时候我觉得这些大型应用程序框架在幕后做了太多的“黑盒魔术”,我真的很想调整它。

感谢您的任何帮助和/或建议!


哦,我想所有的JBoss从6

+0

Spring的IOC和自动装配是不是你想要的?它可以让你创建任何其他类可以到达的单身人士。 – 2011-04-10 01:11:03

+0

我的猜测是他目前的项目中没有Spring。恕我直言,只为单身人士添加Spring将是一个矫枉过正的行为。 – 2011-04-10 02:12:47

回答

4

以下是一种方法。一个servlet上下文侦听器添加到您的web.xml,例如:

<listener> 
    <listener-class>com.example.BackgroundServletContextListener</listener-class> 
</listener> 

然后创建一个类来管理您的后台服务。在这个例子中,我使用单线程ScheduledExecutorService安排它每5分钟运行:

public class BackgroundServletContextListener implements ServletContextListener { 
    private ScheduledExecutorService executor; 
    private BackgroundService service; 

    public void contextInitialized(ServletContextEvent sce) { 
     service = new BackgroundService(); 

     // setup single thread to run background service every 5 minutes 
     executor = Executors.newSingleThreadScheduledExecutor(); 
     executor.scheduleAtFixedRate(service, 0, 5, TimeUnit.MINUTES); 

     // make the background service available to the servlet context 
     sce.getServletContext().setAttribute("service", service); 
    } 

    public void contextDestroyed(ServletContextEvent sce) { 
     executor.shutdown(); 
    } 
} 

public class BackgroundService implements Runnable { 
    public void run() { 
     // do your background processing here 
    } 
} 

如果您需要从Web请求访问BackgroundService,您可以通过ServletContext访问它。例如。:

ServletContext context = request.getSession().getServletContext(); 
BackgroundService service = (BackgroundService) context.getAttribute("service"); 
+0

这很直观..我已经越过了实现上下文监听器的概念,我只是不知道如何使该服务可用于Web应用程序的其他部分。 context.setAttribute()似乎是应该做的。谢谢! – jerluc 2011-04-10 07:16:58

+0

这非常有帮助。我想知道它是否可以在JBoss AS 5.1.0上使用?我无法找到此版本中内置的ServletContextListener ...如果我从JBoss 7.1下载到lib或构建路径中添加“jboss-servlet-api_3.0_spec-1.0.0.Final.jar”,我可以使用javax。 servlet,但我相信这会导致一些兼容性问题。 5.1有没有好的选择? – 2013-08-05 20:14:20

2

运行这个你有没有考虑使用EJB 3.1会话bean?这些可以部署在war文件中,并可以使用@Singleton和@Startup进行注释。

许多EJB 3.1的注解旨在将Spring的好东西带入Java EE框架。这可能是你正在考虑的重新发明已经为你完成了。

0

如果你必须推出自己的,你可以创建一个servlet和配置,当应用程序使用load-on-startup它启动。几年前,我建立了一个这样的系统。然后,我们使用新的(ish)java.util.concurrent类似于ExecutorService的东西来让它处理来自其他servlet的工作。

有关您想要做什么以及现有做事方式不足的更多信息将有所帮助。