java ee后台服务

标签 java servlets jakarta-ee

如果我对此描述不正确,请原谅我,但本质上我是在尝试让一个类似服务的类在服务器启动时仅实例化一次,并在后台“存在”直到它在服务器停止时被杀死。至少据我所知,这与典型的 servlet 并不完全相同(尽管我对此可能是错误的)。更重要的是,我以后还需要能够访问此服务/对象。

例如,在我参与的另一个项目中,我们使用 Spring 框架来完成类似的事情。本质上,我们使用配置 XML 文件和内置注释来让 Spring 知道实例化我们的一些服务的实例。稍后,我们使用注解 @Autowired 来“获取”这个预实例化服务/对象的对象引用。

因此,尽管它可能看起来与 Java 本身的一些主要概念相违背,但我只是想弄清楚如何在这里重新发明这个轮子。我想有时候我觉得这些大型应用程序框架在幕后做了太多的“黑盒魔术”,我真的很希望能够对其进行微调。

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


哦,我正在尝试从 JBoss 6 运行这一切

最佳答案

这是一种方法。将 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
    }
}

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

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

关于java ee后台服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5608624/

相关文章:

java - 即使设置类路径后,包 javax.servlet 也不存在

java - 如何让Web App中的类对象始终保持 Activity 状态?

java - 在 Java 中登录 - 每次变量更改时自动转储变量值的任何方式

java - POJO 对象的 JAX-RS 通用工厂

java - 将 session 属性传递到自定义 JSP 标记中

java - Wildfly web.xml 安全约束使用 ContainerRequestFilter 阻止 JAX-RS 方法的基本身份验证 header

java - 创建一个只运行一次的java应用程序

java - Apache Tomcat 上的 Servlet 和 JAR

java - HttpServlet 无法解析为类型....这是 Eclipse 中的错误吗?

jakarta-ee - 添加到 ArrayList 时 Tomcat 上的运行时异常