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); int deleteByLockName(String lockName);
OmsLockDO findByLockName(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.model.OmsLockDO;
import com.github.kfcfans.powerjob.server.persistence.core.repository.OmsLockRepository; import com.github.kfcfans.powerjob.server.persistence.core.repository.OmsLockRepository;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/** /**
* 基于数据库实现的分布式锁 * 基于数据库实现的分布式锁
* *
@ -21,13 +20,25 @@ import javax.annotation.Resource;
@Service @Service
public class DatabaseLockService implements LockService { public class DatabaseLockService implements LockService {
@Resource private final String ownerIp;
private OmsLockRepository omsLockRepository; 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 @Override
public boolean tryLock(String name, long maxLockTime) { public boolean tryLock(String name, long maxLockTime) {
OmsLockDO newLock = new OmsLockDO(name, NetUtils.getLocalHost(), maxLockTime); OmsLockDO newLock = new OmsLockDO(name, ownerIp, maxLockTime);
try { try {
omsLockRepository.saveAndFlush(newLock); omsLockRepository.saveAndFlush(newLock);
return true; return true;