2.5.1 Milestone Notes
新功能特性
- Phoenix-Console 支持 Topic 消费控制
 - 实体聚合根增加 Timer 功能
 - 分布式数据值过期
 - 分布式数据批量删除
 
杂项
- 提高了 Consul 组建集群的稳定性
 - 提高了 Phoenix 测试的稳定性
 
不兼容的 API 变动
1. DistributedDataRemote 包结构调整
- 2.5.0
 - 2.5.1
 
- com.iquantex.phoenix.distributed.data
   - DefaultDistributedDataRemote 
   - DistributedDataRemote
   - api
       - DDataAPI
   - model
       - Subscriber
- com.iquantex.phoenix.core.ddata
    - DistributedDataRemote
    - DData
    - DDataApi
    - DDataMode
    - ExpireDData
    - Subscriber
    - AbstractDistributedDataRemote
- com.iquantex.phoenix.client.ddata
    - ClientDistributedDataRemote
- com.iquantex.phoenix.distributed.data
   - DefaultDistributedDataRemote 
2. DistributedDataRemote 分布式数据远程接口 API 变动
- 2.5.0
 - 2.5.1
 
public interface DistributedDataRemote {
    /**
     * 新增分布式数据
     *
     * @param ddataCls
     * @param ddataCode
     * @param value
     * @param targetTopic
     */
    <T> boolean addDData(Class<T> ddataCls, String ddataCode, Object value, String targetTopic);
    /**
     * 单查询分布式对象,不维护订阅关系
     *
     * @param ddataCls
     * @param ddataCode
     * @param targetTopic
     * @param <T>
     * @return
     */
    <T> T queryDData(Class<T> ddataCls, String ddataCode, String targetTopic);
    /**
     * 调用远程方式获取分布式数据并建立订阅关系
     *
     * @param ddataCls
     * @param ddataCode
     * @param targetTopic
     * @param selfTopic
     * @param <T>
     * @return
     */
    <T> T getDData(Class<T> ddataCls, String ddataCode, String targetTopic, String selfTopic);
    /**
     * 解绑某一订阅者和某一具体的分布式数据之间的订阅关系
     *
     * @param ddataCls
     * @param ddataCode
     * @param targetTopic
     * @param selfTopic
     */
    <T> boolean remove(Class<T> ddataCls, String ddataCode, String targetTopic, String selfTopic);
}
public interface DistributedDataRemote {
    /**
     * 新增单个分布式数据, 由一个聚合根维护
     *
     * @param ddataCls
     * @param ddataCode
     * @param value
     * @param targetTopic
     */
    <T> boolean addSingleDData(
            Class<T> ddataCls, String ddataCode, Object value, String targetTopic);
    /**
     * 新增带过期时间的单个分布式数据, 由一个聚合根维护
     *
     * @param ddataCls
     * @param ddataCode
     * @param value
     * @param targetTopic
     * @param expireTime 过期时间
     */
    <T> boolean addSingleDData(
            Class<T> ddataCls, String ddataCode, Object value, String targetTopic, long expireTime);
    /**
     * 新增分布式数据
     *
     * @param ddataCls
     * @param ddataCode
     * @param value
     * @param targetTopic
     */
    <T> boolean addDData(Class<T> ddataCls, String ddataCode, Object value, String targetTopic);
    /**
     * 新增带过期时间的分布式数据
     *
     * @param ddataCls
     * @param ddataCode
     * @param value
     * @param targetTopic
     * @param expireTime 过期时间
     */
    <T> boolean addDData(
            Class<T> ddataCls, String ddataCode, Object value, String targetTopic, long expireTime);
    /**
     * 单查询单个聚合根的分布式对象,不维护订阅关系
     *
     * @param ddataCls
     * @param ddataCode
     * @param targetTopic
     * @param <T>
     * @return
     */
    <T> DData<T> querySingleDData(Class<T> ddataCls, String ddataCode, String targetTopic);
    /**
     * 单查询分布式对象,不维护订阅关系
     *
     * @param ddataCls
     * @param ddataCode
     * @param targetTopic
     * @param <T>
     * @return
     */
    <T> DData<T> queryDData(Class<T> ddataCls, String ddataCode, String targetTopic);
    /**
     * 调用远程方式获取单个聚合根的分布式数据并建立订阅关系
     *
     * @param ddataCls
     * @param ddataCode
     * @param targetTopic
     * @param selfTopic
     * @param <T>
     * @return
     */
    <T> DData<T> subscribeSingle(
            Class<T> ddataCls, String ddataCode, String targetTopic, String selfTopic);
    /**
     * 解绑某一订阅者和某一具体单个聚合根的分布式数据之间的订阅关系
     *
     * @param ddataCls
     * @param ddataCode
     * @param targetTopic
     * @param selfTopic
     */
    <T> boolean unsubscribeSingle(
            Class<T> ddataCls, String ddataCode, String targetTopic, String selfTopic);
    /**
     * 调用远程方式获取分布式数据并建立订阅关系
     *
     * @param ddataCls
     * @param ddataCode
     * @param targetTopic
     * @param selfTopic
     * @param <T>
     * @return
     */
    <T> DData<T> subscribe(
            Class<T> ddataCls, String ddataCode, String targetTopic, String selfTopic);
    /**
     * 解绑某一订阅者和某一具体的分布式数据之间的订阅关系
     *
     * @param ddataCls
     * @param ddataCode
     * @param targetTopic
     * @param selfTopic
     */
    <T> boolean unsubscribe(
            Class<T> ddataCls, String ddataCode, String targetTopic, String selfTopic);
    /**
     * 清除该类下所有的分布式数据, 仅作用于 MultiMode
     *
     * @param ddataCls
     * @param targetTopic
     */
    <T> boolean clear(Class<T> ddataCls, String targetTopic);
}
3. DDataMap 接口新增 API
public class DDataMap<VALUE> implements Serializable {
    /**
     * 更新本地的分布式数据
     *
     * @param key
     * @param value
     */
    public void updateLocal(String key, VALUE value);
    /** 更新带过期时间的本地的分布式数据 */
    public void updateLocal(String key, VALUE value, long expireTime);
    /**
     * 根据订阅消息更新本地缓存
     *
     * @param cmd
     */
    public void updateLocal(DdataChangeCmd cmd);
    /**
     * <strong>Warning:</strong> 清理本地缓存以及远程分布式聚合根下的所有分布式数据.
     *
     * @return
     */
    public boolean clear();
}
4. DdataChangeCmd 类新增方法
public class DdataChangeCmd implements WriteCmd {
    /**
     * 新增获取过期时间
     * @return 可能为 null
     */
    public Long getExpireTime();
}