如何在Servlet中将IBM WebSphere work manager与Spring @Scheduled注解结合使用
适配WebSphere 8.5 + Spring
@Scheduled 线程托管方案 核心实现逻辑
Spring的@Scheduled默认使用内置线程池运行任务,只需要将底层的任务执行器替换为WebSphere托管的WorkManagerTaskExecutor,就能在保留@Scheduled便捷配置能力的同时,实现所有任务线程由WebSphere容器统一管控。
具体配置步骤
- 第一步:在Spring配置类上添加
@EnableScheduling注解,开启定时任务基础能力 - 第二步:配置
WorkManagerTaskExecutorBean,绑定WebSphere容器提供的work manager资源:
@Bean public WorkManagerTaskExecutor workManagerTaskExecutor() { WorkManagerTaskExecutor executor = new WorkManagerTaskExecutor(); // 填写你在WebSphere控制台中配置的work manager对应的JNDI名称,默认通用值为wm/default executor.setJndiName("java:comp/env/wm/你的自定义work manager名称"); executor.setResourceRef(true); return executor; }
- 第三步:实现
SchedulingConfigurer接口,将上述托管执行器绑定到定时任务调度器:
@Configuration @EnableScheduling public class ScheduledTaskConfig implements SchedulingConfigurer { @Autowired private WorkManagerTaskExecutor workManagerTaskExecutor; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { // 直接绑定托管执行器,Spring会自动适配为调度器可用的执行逻辑 taskRegistrar.setTaskExecutor(workManagerTaskExecutor); } }
- 第四步:正常使用
@Scheduled注解配置定时任务规则即可,所有任务的执行线程都会从WebSphere托管的work manager线程池中获取,完全符合容器线程管控要求。
注意事项
- 需提前在WebSphere控制台中创建自定义work manager,配置好线程数、优先级、异常策略等参数,控制台填写的JNDI名称要和代码中配置的完全一致
- 如果启用了资源引用校验,需要在
web.xml中添加对应work manager的resource-ref配置,避免JNDI查找失败 - WebSphere 8.5对应的Spring版本建议选择4.x及以上,保证
WorkManagerTaskExecutor的API兼容性 - 不要使用Java EE 7规范的
DefaultManagedTaskExecutor,该组件不兼容WebSphere 8.5的Java EE 6运行环境
内容的提问来源于stack exchange,提问作者fishbone
相关产品推荐
相关产品推荐

