package com.robert.vesta.service.impl.provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.util.StringUtils;
import com.robert.vesta.util.IpUtils;
public class DbMachineIdProvider implements MachineIdProvider {
private static final Logger log = LoggerFactory
.getLogger(DbMachineIdProvider.class);
private long machineId;
private JdbcTemplate jdbcTemplate;
public DbMachineIdProvider() {
log.debug("IpConfigurableMachineIdProvider constructed.");
}
public void init() {
String ip = IpUtils.getHostIp();
if (StringUtils.isEmpty(ip)) {
String msg = "Fail to get host IP address. Stop to initialize the DbMachineIdProvider provider.";
log.error(msg);
throw new IllegalStateException(msg);
}
Long id = null;
try {
id = jdbcTemplate.queryForObject(
"select ID from DB_MACHINE_ID_PROVIDER where IP = ?",
new Object[] { ip }, Long.class);
} catch (EmptyResultDataAccessException e) {
// Ignore the exception
log.error("No allocation before for ip {}.", ip);
}
if (id != null) {
machineId = id;
return;
}
log.info(
"Fail to get ID from DB for host IP address {}. Next step try to allocate one.",
ip);
int count = jdbcTemplate
.update("update DB_MACHINE_ID_PROVIDER set IP = ? where IP is null limit 1",
ip);
if (count <= 0 || count > 1) {
String msg = String
.format("Fail to allocte ID for host IP address {}. The {} records are updated. Stop to initialize the DbMachineIdProvider provider.",
ip, count);
log.error(msg);
throw new IllegalStateException(msg);
}
try {
id = jdbcTemplate.queryForObject(
"select ID from DB_MACHINE_ID_PROVIDER where IP = ?",
new Object[] { ip }, Long.class);
} catch (EmptyResultDataAccessException e) {
// Ignore the exception
log.error("Fail to do allocation for ip {}.", ip);
}
if (id == null) {
String msg = String
.format("Fail to get ID from DB for host IP address {} after allocation. Stop to initialize the DbMachineIdProvider provider.",
ip);
log.error(msg);
throw new IllegalStateException(msg);
}
machineId = id;
}
public long getMachineId() {
return machineId;
}
public void setMachineId(long machineId) {
this.machineId = machineId;
}
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}