package me.hao0.antares.store.dao.impl; import com.google.common.collect.Lists; import me.hao0.antares.common.model.JobServer; import me.hao0.antares.store.dao.JobServerDao; import me.hao0.antares.store.support.RedisKeys; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Repository; import java.util.List; import java.util.Set; /** * Author: haolin * Email: haolin.h0@gmail.com */ @Repository public class JobServerDaoImpl implements JobServerDao { @Autowired protected StringRedisTemplate redis; @Override public Boolean bind(JobServer jobServer) { String server = jobServer.getServer(); String jobId = jobServer.getJobId().toString(); String serverJobsKey = RedisKeys.keyOfServerJobs(server); if (redis.opsForSet().add(serverJobsKey, jobId) > 0){ // bind the job's server try { redis.opsForHash().put(RedisKeys.JOB_SERVER_MAPPINGS, jobId, server); } catch (Exception e){ redis.opsForSet().remove(serverJobsKey, jobId); } return Boolean.TRUE; } return Boolean.FALSE; } @Override public Boolean unbindJobsOfServer(String server) { List<Long> jobIds = findJobsByServer(server); // remove all job server mapping for (Long jobId : jobIds){ redis.opsForHash().delete(RedisKeys.JOB_SERVER_MAPPINGS, jobId.toString()); } // delete the server's jobs key redis.delete(RedisKeys.keyOfServerJobs(server)); return Boolean.TRUE; } @Override public Boolean unbindJob(Long jobId) { String jobIdStr = jobId.toString(); String server = String.valueOf(redis.opsForHash().get(RedisKeys.JOB_SERVER_MAPPINGS, jobIdStr)); // remove the job from the server String serverJobsKey = RedisKeys.keyOfServerJobs(server); redis.opsForSet().remove(serverJobsKey, jobIdStr); // remote the job server mapping redis.opsForHash().delete(RedisKeys.JOB_SERVER_MAPPINGS, jobIdStr); return Boolean.TRUE; } @Override public String findServerByJobId(Long jobId) { Object server = redis.opsForHash().get(RedisKeys.JOB_SERVER_MAPPINGS, jobId.toString()); if (server == null){ return null; } return server.toString(); } @Override public List<Long> findJobsByServer(String server) { String serverJobsKey = RedisKeys.keyOfServerJobs(server); Set<String> jobIdsStr = redis.opsForSet().members(serverJobsKey); List<Long> jobIds = Lists.newArrayListWithExpectedSize(jobIdsStr.size()); for (String jobIdStr : jobIdsStr){ jobIds.add(Long.valueOf(jobIdStr)); } return jobIds; } @Override public Long countJobsByServer(String server) { String serverJobsKey = RedisKeys.keyOfServerJobs(server); return redis.opsForSet().size(serverJobsKey); } }