멀티 스레딩 환경에서 임계구역에 여러 번 접근하기
분산 환경에서 동시성 처리
public <T> T executeInSpinLock(String lockKey, Supplier<T> supplier) {
while (Boolean.FALSE.equals(acquireLock(lockKey))) {
ThreadUtil.sleep(100, TimeUnit.MILLISECONDS);
}
try {
return supplier.get();
} catch (Exception e) {
errorNotifier.sendErrorMessage("error occurs in executing task in lock", e);
throw e;
} finally {
applicationEventPublisher.publishEvent(RedisUnlockEvent.of(lockKey));
}
}
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION, fallbackExecution = true)
public void releaseLock(RedisUnlockEvent event) {
redisTemplate.delete(event.getLockKey());
}특징
Last updated