如何配置Hazelcast Scheduled Executor固定任务运行实例仅故障时迁移
问题根因
你遇到的新实例启动后任务自动迁移到新实例的问题,是Hazelcast Scheduled Executor Service的默认行为导致的:默认配置下,定时任务绑定到集群的某一个分区,当集群有新成员加入触发分区重平衡时,任务会随所属分区一同迁移到新的分区所有者节点执行,因此会打破原有的调度周期。
解决方案
只需调整定时执行器的配置,关闭分区重平衡时的任务自动迁移即可,配置开启后仅当任务原执行节点宕机时,才会触发任务故障转移到其他健康节点,不会随新实例加入自动迁移。
1. 代码方式配置示例
Config hazelcastConfig = new Config(); // 获取你定义的调度器对应的配置 ScheduledExecutorConfig executorConfig = hazelcastConfig.getScheduledExecutorConfig("myScheduledExecutor"); // 核心配置:禁止分区重平衡时迁移待执行任务 executorConfig.setMigrateDeferredTasks(false); // 可选配置:设置任务备份数,建议至少设为1,保证原节点宕机时任务不丢失 executorConfig.setDurability(1); // 后续正常初始化HazelcastInstance即可 HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance(hazelcastConfig);
2. YAML配置文件示例(适用于配置文件声明参数的场景)
hazelcast: scheduled-executor-service: myScheduledExecutor: migrate-deferred-tasks: false durability: 1
原有代码适配
你现有的调度代码无需修改,TaskUtils.named装饰器+捕获DuplicateTaskException的逻辑已经可以保证集群内仅存在一个同名任务,配合上述配置即可完全满足需求:
- 任务始终在初始调度的节点执行
- 仅原节点宕机时,任务才会自动迁移到其他健康节点继续按原有周期执行
- 新实例加入集群不会触发任务迁移,不会打破原有调度周期(比如6小时执行一次的任务不会因为新节点加入而重置计时)
内容的提问来源于stack exchange,提问作者Cosmin
相关产品推荐
相关产品推荐

