Quartz任务的Zookeeper分布式锁定

g6ll5ycj  于 5个月前  发布在  Apache
关注(0)|答案(1)|浏览(53)

为了解决这个问题,How to run quartz task on single pod in kubernetes cluster?
我知道zookeeper是一个很好的选择,它可以防止quartz任务在所有运行的kubernetes pod上执行,用于spring mvc应用程序(目前正在每个pod上执行)
我已经创建了如下配置

@Configuration
public class ZookeeperConfig {

    @Bean
    public CuratorFramework client() {
        CuratorFramework client = CuratorFrameworkFactory.newClient(10.200.XX.XX:2181, new ExponentialBackoffRetry(1000, 3));
        client.start();
        return client;
    }

}

字符串
并在我的QuartzTask类中进行了autowired,该类由我的应用程序中可用的每个Task进行了扩展。

@Autowired
CuratorFramework client;

@Override
public final void execute() throws TaskException {
    executionThread = Thread.currentThread();
    String taskName = getTaskName();

    try {
        InterProcessMutex lock = new InterProcessMutex(client, "/admintasks");
        if ( lock.acquire(10000, TimeUnit.MILLISECONDS) )
        {
            try
            {
                LOG.info("Lock acquired, executing task");
                execute(taskName);
            }
            finally
            {
                lock.release();
                LOG.info("Task executed, lock released");
            }
        }
    } catch (Exception e) {
        LOG.error("Exception while trying to execute task with name :: "+taskName, e);
    }
}


我已经测试了我的应用程序,并检查了任务是否仍在每个pod上执行。
我只需要在任何可用的窗格中执行一次任务,而不是在所有窗格中执行。
有谁能帮忙吗?

6qftjkof

6qftjkof1#

你所做的是,你已经确保任务不会并行执行,但我希望你的quartz配置使用RAMJobStore,所以Quartz的每个示例都作为一个单一的实体,所以每个示例都会运行作业,它只会等待锁。
你可以做的是:

  • make lock.acquire有一个非常短的超时- get或fail。它对于快速任务不是很可靠,但是如果task足够长,你可以得到它将工作得很好的参数。
  • 从所有示例中选择引线,并仅在该示例上运行作业。

相关问题