001package net.gdface.facelog.client; 002 003import java.net.URI; 004import java.net.URL; 005import java.util.List; 006import java.util.Map; 007 008import com.google.common.base.Function; 009import com.google.common.base.Supplier; 010import com.google.common.util.concurrent.Futures; 011import com.google.common.util.concurrent.ListenableFuture; 012 013import gu.dtalk.MenuItem; 014import gu.dtalk.cmd.CmdManager; 015import gu.dtalk.cmd.TaskManager; 016import gu.dtalk.engine.BaseDispatcher; 017import gu.dtalk.engine.TaskDispatcher; 018import gu.simplemq.IMessageAdapter; 019import gu.simplemq.IMessageQueueFactory; 020import net.gdface.facelog.MQParam; 021import net.gdface.facelog.Token; 022import net.gdface.facelog.client.ClientExtendTools.ParameterSupplier; 023import net.gdface.facelog.client.dtalk.DtalkEngineForFacelog; 024import net.gdface.facelog.hb.DynamicChannelListener; 025import net.gdface.facelog.hb.DeviceHeartbeat; 026import net.gdface.facelog.thrift.IFaceLogThriftClientAsync; 027import net.gdface.thrift.ClientFactory; 028 029public class IFaceLogClientAsync extends IFaceLogThriftClientAsync { 030 private final ClientExtendTools clientTools; 031 public IFaceLogClientAsync(ClientFactory factory) { 032 super(factory); 033 clientTools = new ClientExtendTools(this); 034 } 035 /** 036 * @param host RPC service host 037 * @param port RPC service port 038 */ 039 public IFaceLogClientAsync(String host,int port) { 040 this(ClientFactory.builder().setHostAndPort(host,port)); 041 } 042 /** 043 * test if connectable for RPC service 044 * @return return {@code true} if connectable ,otherwise {@code false} 045 */ 046 public boolean testConnect(){ 047 return getFactory().testConnect(); 048 } 049 /** 050 * 如果{@code host}是本机地址则用facelog服务主机名替换 051 * @param host 052 * @return {@code host} or host in {@link #factory} 053 */ 054 public String insteadHostIfLocalhost(String host) { 055 return clientTools.insteadHostIfLocalhost(host); 056 } 057 /** 058 * 如果{@code uri}的主机名是本机地址则用facelog服务主机名替换 059 * @param uri 060 * @return {@code uri} or new URI instead with host of facelog 061 */ 062 public URI insteadHostIfLocalhost(URI uri) { 063 return clientTools.insteadHostIfLocalhost(uri); 064 } 065 /** 066 * 如果{@code url}的主机名是本机地址则用facelog服务主机名替换 067 * @param url 068 * @return {@code url} or new URI instead with host of facelog 069 */ 070 public URL insteadHostIfLocalhost(URL url) { 071 return clientTools.insteadHostIfLocalhost(url); 072 } 073 /** 074 * @param deviceId 075 * @return Supplier instance 076 * @see net.gdface.facelog.client.ClientExtendTools#getDeviceGroupIdSupplier(int) 077 */ 078 public Supplier<Integer> getDeviceGroupIdSupplier(int deviceId) { 079 return clientTools.getDeviceGroupIdSupplier(deviceId); 080 } 081 /** 082 * @param personId 083 * @return Supplier instance 084 * @see net.gdface.facelog.client.ClientExtendTools#getPersonGroupBelonsSupplier(int) 085 */ 086 public Supplier<List<Integer>> getPersonGroupBelonsSupplier(int personId) { 087 return clientTools.getPersonGroupBelonsSupplier(personId); 088 } 089 /** 090 * @param token 091 * @return CmdManager instance 092 * @see net.gdface.facelog.client.ClientExtendTools#makeCmdManager(net.gdface.facelog.Token) 093 */ 094 public CmdManager makeCmdManager(Token token) { 095 return clientTools.makeCmdManager(token); 096 } 097 /** 098 * @param token 099 * @param cmdpath 设备(菜单)命令路径 100 * @param taskQueueSupplier 101 * @return TaskManager instance 102 * @see net.gdface.facelog.client.ClientExtendTools#makeTaskManager(Token, String, Supplier) 103 */ 104 public TaskManager makeTaskManager(Token token, String cmdpath, Supplier<String> taskQueueSupplier) { 105 return clientTools.makeTaskManager(token, null, taskQueueSupplier); 106 } 107 /** 108 * @param token 109 * @return BaseDispatcher instance 110 * @see net.gdface.facelog.client.ClientExtendTools#makeCmdDispatcher(net.gdface.facelog.Token) 111 */ 112 public BaseDispatcher makeCmdDispatcher(Token token) { 113 return clientTools.makeCmdDispatcher(token); 114 } 115 /** 116 * @param token 117 * @param taskQueueSupplier 118 * @return TaskDispatcher instance 119 * @see net.gdface.facelog.client.ClientExtendTools#makeTaskDispatcher(Token, Supplier) 120 */ 121 protected TaskDispatcher makeTaskDispatcher(Token token, Supplier<String> taskQueueSupplier) { 122 return clientTools.makeTaskDispatcher(token, taskQueueSupplier); 123 } 124 /** 125 * @param duration 126 * @param token 127 * @return Supplier instance 128 * @see net.gdface.facelog.client.ClientExtendTools#getAckChannelSupplier(int, net.gdface.facelog.Token) 129 */ 130 public Supplier<String> getAckChannelSupplier(int duration, Token token) { 131 return clientTools.getAckChannelSupplier(duration,token); 132 } 133 /** 134 * @param token 135 * @return Supplier instance 136 * @see net.gdface.facelog.client.ClientExtendTools#getAckChannelSupplier(net.gdface.facelog.Token) 137 */ 138 public Supplier<String> getAckChannelSupplier(Token token) { 139 return clientTools.getAckChannelSupplier(token); 140 } 141 /** 142 * @param token 143 * @return Supplier instance 144 * @see net.gdface.facelog.client.ClientExtendTools#getCmdSnSupplier(net.gdface.facelog.Token) 145 */ 146 public Supplier<Integer> getCmdSnSupplier(Token token) { 147 return clientTools.getCmdSnSupplier(token); 148 } 149 150 /** 151 * @param deviceToken 152 * @param rootMenu 153 * @return DtalkEngineForFacelog instance 154 * @see net.gdface.facelog.client.ClientExtendTools#initDtalkEngine(net.gdface.facelog.Token, gu.dtalk.MenuItem) 155 */ 156 public DtalkEngineForFacelog initDtalkEngine(Token deviceToken, MenuItem rootMenu) { 157 return clientTools.initDtalkEngine(deviceToken, rootMenu); 158 } 159 /** 160 * @param token 161 * @see net.gdface.facelog.client.ClientExtendTools#initMQDefaultFactory(net.gdface.facelog.Token) 162 */ 163 public void initMQDefaultFactory(Token token) { 164 clientTools.initMQDefaultFactory(token); 165 } 166 /** 167 * 转换参数中的主机名 168 * @see net.gdface.facelog.thrift.IFaceLogThriftClientAsync#getRedisParameters(net.gdface.facelog.Token) 169 * @see ClientExtendTools#insteadHostOfMQParamIfLocalhost(Map) 170 */ 171 @Override 172 public ListenableFuture<Map<MQParam, String>> getRedisParameters(Token token) { 173 ListenableFuture<Map<MQParam, String>> feature = super.getRedisParameters(token); 174 return Futures.transform(feature, 175 new Function<Map<MQParam, String>, Map<MQParam, String>>() { 176 177 @Override 178 public Map<MQParam, String> apply(Map<MQParam, String> input) { 179 return clientTools.insteadHostOfMQParamIfLocalhost(input); 180 } 181 }); 182 } 183 /** 184 * @param token 185 * @return 返回一个获取redis参数的{@link Supplier}实例 186 * @see net.gdface.facelog.client.ClientExtendTools#getRedisParametersSupplier(net.gdface.facelog.Token) 187 */ 188 public Supplier<Map<MQParam, String>> getRedisParametersSupplier(Token token) { 189 return clientTools.getRedisParametersSupplier(token); 190 } 191 /** 192 * @param token 193 * @return 返回一个获取消息系统参数的{@link Supplier}实例 194 * @see net.gdface.facelog.client.ClientExtendTools#getMessageQueueParametersSupplier(net.gdface.facelog.Token) 195 */ 196 public Supplier<Map<MQParam, String>> getMessageQueueParametersSupplier(Token token) { 197 return clientTools.getMessageQueueParametersSupplier(token); 198 } 199 /** 200 * @param token 201 * @return 返回一个获取设备心跳实时监控通道名的{@link Supplier}实例 202 * @see net.gdface.facelog.client.ClientExtendTools#getMonitorChannelSupplier(net.gdface.facelog.Token) 203 */ 204 public Supplier<String> getMonitorChannelSupplier(Token token) { 205 return clientTools.getDynamicParamSupplier(MQParam.HB_MONITOR_CHANNEL,token); 206 } 207 /** 208 * @param mqParam 209 * @param token 访问令牌 210 * @return 返回一个动态获取指定消息参数的{@link Supplier}实例 211 */ 212 public Supplier<String> getDynamicParamSupplier(MQParam mqParam,Token token){ 213 return clientTools.getDynamicParamSupplier(mqParam,token); 214 } 215 /** 216 * 返回有效令牌的{@link Supplier}实例<br> 217 * @return {@link Supplier}实例 218 */ 219 public Supplier<Token> getTokenSupplier() { 220 return clientTools.getTokenSupplier(); 221 } 222 223 /** 224 * 创建动态频道名侦听对象 225 * 动态频道是指定当服务重启后,频道名会动态改变的频道, 226 * 对于这种频道,通过侦听服务心跳判断服务是否重启,如果重启则重新获取频道名继续保持侦听 227 * @param listener 228 * @param channelType 频道消息数据类型 229 * @param mqParam 参数名 230 * @param token 231 * @param factory 消息系统工厂类实例 232 * @return 返回{@link DynamicChannelListener}实例 233 */ 234 public <T>DynamicChannelListener<T> makeDynamicChannelListener(IMessageAdapter<T> listener,Class<T> channelType, MQParam mqParam, Token token, IMessageQueueFactory factory) { 235 return clientTools.makeDynamicChannelListener(listener, channelType, mqParam, token, factory); 236 } 237 /** 238 * 创建设备心跳包发送对象<br> 239 * {@link DeviceHeartbeat}为单实例,该方法只能调用一次 240 * @param deviceID 设备ID 241 * @param token 设备令牌 242 * @return {@link DeviceHeartbeat}实例 243 */ 244 public DeviceHeartbeat makeHeartbeat(int deviceID, Token token) { 245 return clientTools.makeHeartbeat(deviceID, token); 246 } 247 /** 248 * @param tokenHelper 要设置的 tokenHelper 249 * @return 当前{@link IFaceLogClientAsync}实例 250 */ 251 public IFaceLogClientAsync setTokenHelper(TokenHelper tokenHelper) { 252 clientTools.setTokenHelper(tokenHelper); 253 return this; 254 } 255 /** 256 * 启动服务心跳侦听器<br> 257 * 启动侦听器后CLIENT端才能感知服务端断线,并执行相应动作。 258 * 调用前必须先执行{@link #setTokenHelper(TokenHelper)}初始化 259 * @param token 令牌 260 * @param initMQDefaultFactoryInstance 是否初始化 {@link IMessageQueueFactory}默认实例 261 * @return 返回当前{@link IFaceLogClientAsync}实例 262 */ 263 public IFaceLogClientAsync startServiceHeartbeatListener(Token token, boolean initMQDefaultFactoryInstance) { 264 clientTools.startServiceHeartbeatListener(token, initMQDefaultFactoryInstance); 265 return this; 266 } 267 /** 268 * @param task 269 * @param token 270 * @return ParameterSupplier instance 271 * @see net.gdface.facelog.client.ClientExtendTools#getTaskQueueSupplier(java.lang.String, net.gdface.facelog.Token) 272 */ 273 public ParameterSupplier<String> getTaskQueueSupplier(String task, Token token) { 274 return clientTools.getTaskQueueSupplier(task, token); 275 } 276 /** 277 * @param task 278 * @param sdkVersion 279 * @param token 280 * @return ParameterSupplier instance 281 * @see net.gdface.facelog.client.ClientExtendTools#getSdkTaskQueueSupplier(java.lang.String, java.lang.String, net.gdface.facelog.Token) 282 */ 283 public ParameterSupplier<String> getSdkTaskQueueSupplier(String task, String sdkVersion, Token token) { 284 return clientTools.getSdkTaskQueueSupplier(task, sdkVersion, token); 285 } 286}