序
本文主要解析一下shedlock的实现。
LockProvider
shedlock-core-0.16.1-sources.jar!/net/javacrumbs/shedlock/core/LockProvider.java
1 | 复制代码public interface LockProvider { |
LockProvider入参是lockConfiguration,返回SimpleLock。
StorageBasedLockProvider
shedlock-core-0.16.1-sources.jar!/net/javacrumbs/shedlock/support/StorageBasedLockProvider.java
1 | 复制代码public class StorageBasedLockProvider implements LockProvider { |
使用StorageAccessor来实现加锁
LockManager
shedlock-core-0.16.1-sources.jar!/net/javacrumbs/shedlock/core/LockManager.java
1 | 复制代码/** |
默认实现
shedlock-core-0.16.1-sources.jar!/net/javacrumbs/shedlock/core/DefaultLockManager.java
1 | 复制代码public class DefaultLockManager implements LockManager { |
委托给lockingTaskExecutor来加锁
shedlock-core-0.16.1-sources.jar!/net/javacrumbs/shedlock/core/DefaultLockingTaskExecutor.java
1
2
3 > public class DefaultLockingTaskExecutor implements LockingTaskExecutor {
> private static final Logger logger = LoggerFactory.getLogger(DefaultLockingTaskExecutor.class);
> private final LockProvider lockProvider;
复制代码public DefaultLockingTaskExecutor(LockProvider lockProvider) {
this.lockProvider = requireNonNull(lockProvider);
}
@Override
public void executeWithLock(Runnable task, LockConfiguration lockConfig) {
Optional
if (lock.isPresent()) {
try {
logger.debug(“Locked {}.”, lockConfig.getName());
task.run();
} finally {
lock.get().unlock();
logger.debug(“Unlocked {}.”, lockConfig.getName());
}
} else {
logger.debug(“Not executing {}. It’s locked.”, lockConfig.getName());
}
}
1 | } |
复制代码>这里跟lockProvider衔接上
SpringLockableTaskSchedulerFactoryBean(偷梁换柱
)
shedlock-spring-0.16.1-sources.jar!/net/javacrumbs/shedlock/spring/SpringLockableTaskSchedulerFactoryBean.java
1 |
复制代码@Override
public Class<?> getObjectType() {
return LockableTaskScheduler.class;
}
@Override
protected LockableTaskScheduler createInstance() throws Exception {
return new LockableTaskScheduler(
taskScheduler,
new DefaultLockManager(lockProvider, new SpringLockConfigurationExtractor(defaultLockAtMostFor, defaultLockAtLeastFor, embeddedValueResolver))
);
}
1 |
复制代码>主要是LockableTaskScheduler的工厂方法
LockableTaskScheduler(task scheduler lock wrapper
)
shedlock-spring-0.16.1-sources.jar!/net/javacrumbs/shedlock/spring/LockableTaskScheduler.java
1 | public class LockableTaskScheduler implements TaskScheduler, DisposableBean { |
复制代码public LockableTaskScheduler(TaskScheduler taskScheduler, LockManager lockManager) {
this.taskScheduler = requireNonNull(taskScheduler);
this.lockManager = requireNonNull(lockManager);
}
@Override
public ScheduledFuture<?> schedule(Runnable task, Trigger trigger) {
return taskScheduler.schedule(wrap(task), trigger);
}
@Override
public ScheduledFuture<?> schedule(Runnable task, Date startTime) {
return taskScheduler.schedule(wrap(task), startTime);
}
@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, Date startTime, long period) {
return taskScheduler.scheduleAtFixedRate(wrap(task), startTime, period);
}
@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, long period) {
return taskScheduler.scheduleAtFixedRate(wrap(task), period);
}
@Override
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, Date startTime, long delay) {
return taskScheduler.scheduleWithFixedDelay(wrap(task), startTime, delay);
}
@Override
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, long delay) {
return taskScheduler.scheduleWithFixedDelay(wrap(task), delay);
}
private Runnable wrap(Runnable task) {
return new LockableRunnable(task, lockManager);
}
@Override
public void destroy() throws Exception {
if (taskScheduler instanceof DisposableBean) {
((DisposableBean) taskScheduler).destroy();
}
}
1 | } |
复制代码>对task scheduler包装了一层,织入了lock的逻辑
问题
上面将了半天,讲了lockProvider以及lockManager,还有LockableTaskScheduler是如何给task scheduler加上锁的,还有LockableTaskScheduler的工厂方法SpringLockableTaskSchedulerFactoryBean。那么问题来了,spring的schedule凭什么就使用你配置的LockableTaskScheduler呢?
1 | @Bean |
这种配置仅仅当spring工厂里头没有配置taskScheduler的时候,起作用。如果项目已经显示指定taskScheduler的时候,那么就不会使用LockableTaskScheduler。不过可以通过实现SchedulingConfigurer接口强制指定使用LockableTaskScheduler。
doc
本文转载自: 掘金