前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊puma的ClientPositionService

聊聊puma的ClientPositionService

原创
作者头像
code4it
修改2020-06-09 10:25:54
2440
修改2020-06-09 10:25:54
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下puma的ClientPositionService

ClientPositionService

puma/puma/src/main/java/com/dianping/puma/biz/service/ClientPositionService.java

代码语言:javascript
复制
public interface ClientPositionService {
​
    List<ClientPositionEntity> findAll();
​
    ClientPositionEntity find(String clientName);
​
    void update(ClientPositionEntity clientPositionEntity, boolean flush);
​
    void flush();
​
    void cleanUpTestClients();
}
  • ClientPositionService定义了findAll、find、update、flush、cleanUpTestClients方法

ClientPositionServiceImpl

puma/puma/src/main/java/com/dianping/puma/biz/service/impl/ClientPositionServiceImpl.java

代码语言:javascript
复制
@Service
public class ClientPositionServiceImpl implements ClientPositionService {
​
    private final static Logger logger = LoggerFactory.getLogger(ClientPositionServiceImpl.class);
​
    @Autowired
    private ClientPositionDao clientPositionDao;
​
    private Map<String, ClientPositionEntity> positionEntityMap = new ConcurrentHashMap<String, ClientPositionEntity>();
​
    @Override
    public List<ClientPositionEntity> findAll() {
        return clientPositionDao.findAll();
    }
​
    @Override
    public ClientPositionEntity find(String clientName) {
        return clientPositionDao.findByClientName(clientName);
    }
​
    @Override
    public void update(ClientPositionEntity clientPositionEntity, boolean flush) {
        if (flush) {
            positionEntityMap.remove(clientPositionEntity.getClientName());
            insertOrUpdate(clientPositionEntity);
        } else {
            positionEntityMap.put(clientPositionEntity.getClientName(), clientPositionEntity);
        }
    }
​
    @Scheduled(fixedDelay = 5000)
    public void flush() {
        Set<String> keys = positionEntityMap.keySet();
        for (String key : keys) {
            ClientPositionEntity entity = positionEntityMap.remove(key);
            if (entity == null) {
                continue;
            }
            insertOrUpdate(entity);
        }
    }
​
    private void insertOrUpdate(ClientPositionEntity entity) {
        try {
            entity.setUpdateTime(new Date());
            int updateRow = clientPositionDao.update(entity);
            if (updateRow == 0) {
                clientPositionDao.insert(entity);
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
    }
​
    public void cleanUpTestClients() {
        List<ClientPositionEntity> clients = clientPositionDao.findOldTestClient();
        for (ClientPositionEntity entity : clients) {
            clientPositionDao.delete(entity.getId());
        }
    }
}
  • ClientPositionServiceImpl实现了ClientPositionService接口,其findAll方法执行clientPositionDao.findAll();其find方法执行clientPositionDao.findByClientName(clientName);其update方法在flush为true时执行positionEntityMap.remove及insertOrUpdate,在flush为false时执行positionEntityMap.put;其flush方法遍历positionEntityMap,挨个移除,然后执行insertOrUpdate(entity)

ClientPositionDao

puma/biz/src/main/java/com/dianping/puma/biz/dao/ClientPositionDao.java

代码语言:javascript
复制
public interface ClientPositionDao {
​
    List<ClientPositionEntity> findAll();
​
    ClientPositionEntity findByClientName(String clientName);
​
    int update(ClientPositionEntity entity);
​
    int insert(ClientPositionEntity entity);
​
    int delete(int id);
​
    List<ClientPositionEntity> findOldTestClient();
}
  • ClientPositionDao定义了findAll、findByClientName、update、insert、delete、findOldTestClient方法

ClientPositionEntity

puma/biz/src/main/java/com/dianping/puma/biz/entity/ClientPositionEntity.java

代码语言:javascript
复制
public class ClientPositionEntity extends BaseEntity {
​
    private String clientName;
​
    private String binlogFile;
​
    private long binlogPosition;
​
    private long serverId;
​
    private int eventIndex;
​
    private long timestamp;
​
    //......
​
}
  • ClientPositionEntity继承了BaseEntity,定义了clientName、binlogFile、binlogPosition、serverId、eventIndex、timestamp属性

ClientPositionMapper

puma/biz/src/main/resources/sqlmap/ClientPositionMapper.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
​
<mapper namespace="com.dianping.puma.biz.dao.ClientPositionDao">
​
    <select id="findAll" resultType="ClientPositionEntity">
        SELECT * FROM ClientPosition
    </select>
​
    <select id="findByClientName" resultType="ClientPositionEntity">
        SELECT * FROM ClientPosition where ClientName = #{clientName}
    </select>
​
    <update id="update" parameterType="ClientPositionEntity">
        update ClientPosition
        set
        BinlogFile = #{binlogFile},
        BinlogPosition = #{binlogPosition},
        ServerId = #{serverId},
        EventIndex = #{eventIndex},
        Timestamp = #{timestamp},
        UpdateTime = #{updateTime}
        where
        ClientName = #{clientName}
    </update>
​
    <insert id="insert" parameterType="ClientPositionEntity" useGeneratedKeys="true" keyProperty="id">
        insert into ClientPosition
        (
        ClientName,
        BinlogFile,
        BinlogPosition,
        ServerId,
        EventIndex,
        Timestamp,
        UpdateTime
        )
        values
        (
        #{clientName},
        #{binlogFile},
        #{binlogPosition},
        #{serverId},
        #{eventIndex},
        #{timestamp},
        #{updateTime}
        )
    </insert>
​
    <select id="findOldTestClient" resultType="ClientPositionEntity">
        select * from ClientPosition
        where UpdateTime &lt; NOW() - INTERVAL 10 DAY
        and ClientName like '%test'
    </select>
​
    <delete id="delete" parameterType="int">
        delete from ClientPosition where id = #{id}
    </delete>
​
</mapper>
  • ClientPositionMapper实现了ClientPositionDao定义的方法

小结

ClientPositionService定义了findAll、find、update、flush、cleanUpTestClients方法;ClientPositionServiceImpl实现了ClientPositionService接口,其findAll方法执行clientPositionDao.findAll();其find方法执行clientPositionDao.findByClientName(clientName);其update方法在flush为true时执行positionEntityMap.remove及insertOrUpdate,在flush为false时执行positionEntityMap.put;其flush方法遍历positionEntityMap,挨个移除,然后执行insertOrUpdate(entity)

doc

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ClientPositionService
  • ClientPositionServiceImpl
  • ClientPositionDao
  • ClientPositionEntity
  • ClientPositionMapper
  • 小结
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档