Jetty从9.3.27升级至9.4.43构建成功但部署报错Shared scheduler not started
问题原因
Jetty 9.4.x版本对会话管理组件的生命周期依赖逻辑做了不兼容调整:
- 9.3.x版本中,手动实例化的
HouseKeeper会自动关联所属Server实例的共享调度器,无需额外配置 - 9.4.x版本后,手动创建的
HouseKeeper不会自动绑定Server的调度器,启动时就会抛出Shared scheduler not started异常,你的报错栈里HouseKeeper.startScavenging方法的校验逻辑就是触发这个异常的直接原因。
修复方案
推荐使用第一种方案,改动最小且符合Jetty 9.4的设计规范:
方案一:使用DefaultSessionIdManager自带的HouseKeeper实例
DefaultSessionIdManager初始化时已经自动绑定了Server的共享调度器,直接获取内置实例修改配置即可,不需要手动new HouseKeeper:
DefaultSessionIdManager defaultSessionIdManager = new DefaultSessionIdManager(server); // 直接获取内置的HouseKeeper实例 HouseKeeper houseKeeper = defaultSessionIdManager.getSessionHouseKeeper(); houseKeeper.setIntervalSec(30); server.setSessionIdManager(defaultSessionIdManager);
方案二:手动为自定义HouseKeeper绑定调度器
如果确实需要使用自定义的HouseKeeper实例,手动注入Server的共享调度器即可:
DefaultSessionIdManager defaultSessionIdManager = new DefaultSessionIdManager(server); HouseKeeper houseKeeper = new HouseKeeper(); // 手动绑定Server的共享调度器 houseKeeper.setScheduler(server.getScheduler()); houseKeeper.setIntervalSec(30); defaultSessionIdManager.setSessionHouseKeeper(houseKeeper); server.setSessionIdManager(defaultSessionIdManager);
修改后重新执行/gradlew clean run即可正常启动。
内容的提问来源于stack exchange,提问作者jega
相关产品推荐
相关产品推荐

