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}