com.aol.micro.server.mysql.distlock.DistributedLockServiceMySqlImpl Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of micro-mysql Show documentation
Show all versions of micro-mysql Show documentation
Opinionated rest microservices
package com.aol.micro.server.mysql.distlock;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import com.aol.micro.server.dist.lock.DistributedLockService;
@Component
public class DistributedLockServiceMySqlImpl implements DistributedLockService {
static final String GET_LOCK_TEMPLATE = "select COALESCE(GET_LOCK(?, 0), 0)";
static final String RELEASE_LOCK_TEMPLATE = "select COALESCE(RELEASE_LOCK(?), 0)";
volatile JdbcTemplate jdbcTemplate;
@Autowired(required = false)
@Qualifier("distLockingDataSource")
public void setSmartDataSource(DataSource dataSource) {
if (dataSource != null)
this.jdbcTemplate = new JdbcTemplate(
dataSource);
}
@Override
public boolean tryLock(String key) {
return executeScalar(GET_LOCK_TEMPLATE, key, 1);
}
@Override
public boolean tryReleaseLock(String key) {
return executeScalar(RELEASE_LOCK_TEMPLATE, key, 1);
}
synchronized boolean executeScalar(String operation, String key, Integer expectedResult) {
int result = jdbcTemplate.queryForObject(operation, new Object[] { key }, Integer.class);
return result == expectedResult;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}