feat: add JVM shutdown hook to release database lock

This commit is contained in:
tjq 2021-02-21 12:43:07 +08:00
parent 91bb28abbb
commit 79a61454f3
2 changed files with 20 additions and 5 deletions

View File

@ -21,4 +21,8 @@ public interface OmsLockRepository extends JpaRepository<OmsLockDO, Long> {
int deleteByLockName(String lockName);
OmsLockDO findByLockName(String lockName);
@Modifying
@Transactional
int deleteByOwnerIP(String ip);
}

View File

@ -6,11 +6,10 @@ import com.github.kfcfans.powerjob.server.extension.LockService;
import com.github.kfcfans.powerjob.server.persistence.core.model.OmsLockDO;
import com.github.kfcfans.powerjob.server.persistence.core.repository.OmsLockRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 基于数据库实现的分布式锁
*
@ -21,13 +20,25 @@ import javax.annotation.Resource;
@Service
public class DatabaseLockService implements LockService {
@Resource
private OmsLockRepository omsLockRepository;
private final String ownerIp;
private final OmsLockRepository omsLockRepository;
@Autowired
public DatabaseLockService(OmsLockRepository omsLockRepository) {
this.ownerIp = NetUtils.getLocalHost();
this.omsLockRepository = omsLockRepository;
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
int num = omsLockRepository.deleteByOwnerIP(ownerIp);
log.info("[DatabaseLockService] execute shutdown hook, release all lock(owner={},num={})", ownerIp, num);
}));
}
@Override
public boolean tryLock(String name, long maxLockTime) {
OmsLockDO newLock = new OmsLockDO(name, NetUtils.getLocalHost(), maxLockTime);
OmsLockDO newLock = new OmsLockDO(name, ownerIp, maxLockTime);
try {
omsLockRepository.saveAndFlush(newLock);
return true;