001package net.gdface.service.sdk; 002 003import java.util.List; 004import java.util.concurrent.TimeUnit; 005 006import com.facebook.swift.service.ThriftEventHandler; 007import com.facebook.swift.service.ThriftServerConfig; 008import com.facebook.swift.service.ThriftServerService; 009import com.google.common.collect.ImmutableList; 010import io.airlift.units.Duration; 011import net.gdface.sdk.BaseFaceApi; 012import net.gdface.sdk.FaceApi; 013import net.gdface.sdk.decorator.FaceApiThriftDecorator; 014import net.gdface.sdk.fse.FeatureSe; 015import net.gdface.sdk.fse.decorator.FeatureSeThriftDecorator; 016import net.gdface.service.sdk.spring.RestfulService; 017 018import static com.google.common.base.Preconditions.*; 019/** 020 * {@link FaceLogImpl}服务封装 021 * @author guyadong 022 * 023 */ 024public class FaceApiService extends ThriftServerService implements FaceApiServiceConstants { 025 private static FaceApiService service; 026 private static FaceApiService httpService; 027 private static final FaceApiServiceConfig serviceConfig = FaceApiServiceConfig.getInstance(); 028 private static final FaceApi FACEAPI_INSTANCE = serviceConfig.getFaceapi(); 029 private static final FeatureSe FSE_INSTANCE = BaseFaceApi.getFeatureSeInstance(FACEAPI_INSTANCE); 030 // 封装为thrift服务的faceapi接口静态实例 031 private static final FaceApiThriftDecorator FACEAPI_THRIFT_DECORATOR = new FaceApiThriftDecorator(FACEAPI_INSTANCE); 032 /** 033 * 从配置文件中读取参数创建{@link ThriftServerConfig}实例 034 * @return 035 */ 036 public static ThriftServerConfig makeThriftServerConfig(){ 037 ThriftServerConfig thriftServerConfig = new ThriftServerConfig(); 038 int intValue ; 039 thriftServerConfig.setPort(serviceConfig.getServicePort()); 040 if((intValue = serviceConfig.getConnectionLimit()) >0){ 041 thriftServerConfig.setConnectionLimit(intValue); 042 } 043 if((intValue = serviceConfig.getIdleConnectionTimeout())>0){ 044 Duration timeout = new Duration(intValue,TimeUnit.SECONDS); 045 thriftServerConfig.setIdleConnectionTimeout(timeout); 046 } 047 if((intValue = serviceConfig.getWorkThreads())>0){ 048 thriftServerConfig.setWorkerThreads(intValue); 049 } 050 return thriftServerConfig; 051 } 052 /** 053 * 创建服务实例(frame,binary) 054 * @return 055 */ 056 public static synchronized final FaceApiService buildService(){ 057 return service = buildService(service,makeThriftServerConfig()); 058 } 059 /** 060 * 创建HTTP服务实例(http,json) 061 * @return 062 */ 063 public static synchronized final FaceApiService buildHttpService(){ 064 return httpService = buildService(httpService, 065 makeThriftServerConfig() 066 .setPort(serviceConfig.getXhrPort()) 067 .setTransportName(ThriftServerService.HTTP_TRANSPORT) 068 .setProtocolName(ThriftServerService.JSON_PROTOCOL)); 069 } 070 /** 071 * 启动RESTful WEB服务实例 072 */ 073 public static synchronized final void startRestfulService(){ 074 075 RestfulService.setHttpPort(serviceConfig.getRestfulPort()); 076 RestfulService.setInterfaceInstance(FACEAPI_INSTANCE); 077 RestfulService.setInterfaceInstance(FSE_INSTANCE); 078 RestfulService.setSwaggerEnable(serviceConfig.isSwaggerEnable()); 079 RestfulService.setCorsEnable(serviceConfig.isCorsEnable()); 080 RestfulService.run(); 081 } 082 /** 083 * 创建服务实例<br> 084 * @param service 服务实例,如果为{@code null}或服务已经停止则创建新的服务实例 085 * @param config thrift服务配置 086 * @return 返回{@code service}或创建的新的服务实例 087 */ 088 private static FaceApiService buildService(FaceApiService service,ThriftServerConfig config){ 089 if(null == service || State.TERMINATED == service.state() || State.FAILED == service.state()){ 090 ImmutableList.Builder<Object> builder = ImmutableList.builder(); 091 builder.add(FACEAPI_THRIFT_DECORATOR); 092 if(null != FSE_INSTANCE){ 093 builder.add(new FeatureSeThriftDecorator(FSE_INSTANCE)); 094 } 095 service = ThriftServerService.bulider() 096 .withServices(builder.build()) 097 .setThriftServerConfig(config) 098 .build(FaceApiService.class); 099 } 100 checkState(State.NEW == service.state(),"INVALID service state %s ",service.toString()); 101 return service; 102 } 103 public FaceApiService(List<?> services, 104 List<ThriftEventHandler> eventHandlers, 105 ThriftServerConfig thriftServerConfig) { 106 super(services, eventHandlers, thriftServerConfig); 107 } 108 /** 109 * @return service 110 */ 111 public static FaceApiService getService() { 112 return service; 113 } 114 /** 115 * @return httpService 116 */ 117 public static FaceApiService getHttpService() { 118 return httpService; 119 } 120}