Tomcat 10 和quartz

问题描述 投票:0回答:2

大家好:今天我们运行的是 Tomcat 9.0.5 和quartz 2.3。我们想迁移到 Tomcat 10,但quartz 2.3 损坏了。你知道quartz 2.4 是否可以与 Tomcat 10 配合使用吗? 谢谢 彼得罗

java tomcat version quartz
2个回答
2
投票

Tomcat 10.0 是 Jakarta Servlet 5.0 容器。这基本上意味着它使用新的

jakarta.servlet.*
软件包而不是
javax.servlet.*
,而它在 9.0 版本上有 很少的改进

另一方面,它与所有依赖 Java EE Servlet 直至 4.0 的库(这是绝大多数库)二进制不兼容。

Quartz 也不例外:即使是

master
git 分支仍然使用
javax.servlet
,因此正式版本将无法在 Tomcat 10.0 上运行。但是,您可以对代码进行分支,将类中的(几乎)所有
javax.*
更改为
jakarta.*
,例如this,然后重新编译。

就我个人而言,我认为迁移到 Tomcat 10.0 没有任何优势,这意味着要么放弃对 Tomcat 9.0 的支持,维护两个版本的 Web 应用程序,要么使用一些

ClassTransformer

 技巧。

编辑: Quartz 似乎已经开始了 Jakartification 流程(参见 PR #913),但尚未发布。


1
投票
解决起来并不困难,我们所做的就是重构并重新实现 org.quartz.ee.servlet 包中的 QuartzInitializerListener.java 和 QuartzInitializerServlet.java 类,反映 jakarta.servlet.* 命名空间。无需使用quartz 实现,只需实现或扩展您的实现即可。

即:

@WebListener public class QuartzContextListener extends QuartzInitializerListener { @Override public void contextInitialized(ServletContextEvent sce) { // Scheduler are started in web.xml parm FILE super.contextInitialized(sce); // Get Access to the Factory ServletContext ctx = sce.getServletContext(); factory = (StdSchedulerFactory) ctx.getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY); // Register the Listeners implemented by this Class //addListeners(); // Default State //SchedulerState = SchedulerStateEnum.SHUTDOWN; // Start the Scheduler startScheduler(); } //contextInitialized @Override public void contextDestroyed(ServletContextEvent sce) { // De-Register the Listeners implemented by this Class //removeListeners(); // Destroy Last - Order of Operation super.contextDestroyed(sce); } //contextDestroyed public static void startScheduler() { try { if( getScheduler().isShutdown() || getScheduler().isInStandbyMode() ) { getScheduler().start(); } } catch(SchedulerException ex) { throw new RuntimeException(ex); } } }
    
© www.soinside.com 2019 - 2024. All rights reserved.