为了解决这个问题,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上执行。
我只需要在任何可用的窗格中执行一次任务,而不是在所有窗格中执行。
有谁能帮忙吗?
1条答案
按热度按时间6qftjkof1#
你所做的是,你已经确保任务不会并行执行,但我希望你的quartz配置使用RAMJobStore,所以Quartz的每个示例都作为一个单一的实体,所以每个示例都会运行作业,它只会等待锁。
你可以做的是:
lock.acquire
有一个非常短的超时- get或fail。它对于快速任务不是很可靠,但是如果task足够长,你可以得到它将工作得很好的参数。