From 79a61454f38c5f7ac7b475793a0e3cb3a8a9779d Mon Sep 17 00:00:00 2001 From: tjq Date: Sun, 21 Feb 2021 12:43:07 +0800 Subject: [PATCH] feat: add JVM shutdown hook to release database lock --- .../core/repository/OmsLockRepository.java | 4 ++++ .../service/lock/DatabaseLockService.java | 21 ++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/repository/OmsLockRepository.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/repository/OmsLockRepository.java index 3f247323..93ed309e 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/repository/OmsLockRepository.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/repository/OmsLockRepository.java @@ -21,4 +21,8 @@ public interface OmsLockRepository extends JpaRepository { int deleteByLockName(String lockName); OmsLockDO findByLockName(String lockName); + + @Modifying + @Transactional + int deleteByOwnerIP(String ip); } diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/lock/DatabaseLockService.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/lock/DatabaseLockService.java index a230d870..f1de733b 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/lock/DatabaseLockService.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/lock/DatabaseLockService.java @@ -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;