| 
					
				 | 
			
			
				@@ -6,14 +6,14 @@ import com.aliyun.oss.OSSClientBuilder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.aliyun.oss.common.auth.CredentialsProvider; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.aliyun.oss.common.auth.DefaultCredentialProvider; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.aliyun.oss.model.OSSObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ctrip.framework.apollo.Config; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ctrip.framework.apollo.ConfigService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import lombok.extern.slf4j.Slf4j; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.io.IOException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.io.InputStreamReader; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.HashMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import java.util.HashSet; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.Map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import java.util.Set; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.concurrent.Executors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.concurrent.ScheduledExecutorService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.concurrent.TimeUnit; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -23,21 +23,44 @@ import java.util.concurrent.TimeUnit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 public class ModelManager { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private static final int SCHEDULE_PERIOD = 10; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private static final String SUCCESS = "_SUCCESS"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private static ModelManager instance; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    Map<String, ModelLoadTask> loadTasks = new HashMap<String, ModelLoadTask>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    Map<String, String> modelPathMap = new HashMap<String, String>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Map<String, ModelLoadTask> loadTasks = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Map<String, String> modelPathMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private OSS client; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private String bucketName; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private final String modelOssEndpoint = "model.oss.endpoint"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private final String modelOssAccessKeyId = "model.oss.accessKeyId"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private final String modelOssAccessKeySecret = "model.oss.accessKetSecret"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private final String modelOssBucketName = "model.oss.bucketName"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private ModelManager() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // TODO config load 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        OssConfig config = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // config load 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Config config = ConfigService.getAppConfig(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String endpoint = config.getProperty(modelOssEndpoint, ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String accessKeyId = config.getProperty(modelOssAccessKeyId, ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String accessKetSecret = config.getProperty(modelOssAccessKeySecret, ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // oss client 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(config.getAccessKeyId(), config.getAccessKeySecret()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        client = new OSSClientBuilder().build(config.getEndpoint(), credentialsProvider); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKetSecret); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        this.client = new OSSClientBuilder().build(endpoint, credentialsProvider); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        this.bucketName = config.getProperty(modelOssBucketName, ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        config.addChangeListener(changeEvent -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (changeEvent.isChanged(modelOssEndpoint) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    || changeEvent.isChanged(modelOssAccessKeyId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    || changeEvent.isChanged(modelOssAccessKeySecret)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String endpointNew = config.getProperty(modelOssEndpoint, ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String accessKeyIdNew = config.getProperty(modelOssAccessKeyId, ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String accessKetSecretNew = config.getProperty(modelOssAccessKeySecret, ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CredentialsProvider credentialsProviderNew = new DefaultCredentialProvider(accessKeyIdNew, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        accessKetSecretNew); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.client = new OSSClientBuilder().build(endpointNew, credentialsProviderNew); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (changeEvent.isChanged(modelOssBucketName)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.bucketName = config.getProperty(modelOssBucketName, ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        this.bucketName = config.getBucketName(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         start(SCHEDULE_PERIOD); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -62,15 +85,17 @@ public class ModelManager { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public void registerModel(String modelName, String path, Class<? extends Model> modelClass) throws ModelRegisterException, IOException { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (modelPathMap.containsKey(modelName)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            String oldPath = modelPathMap.get(modelName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (path.equals(oldPath)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //如果模型的path没有发生改变, 不做任何操作 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                log.info("Model [{}] and Path [{}] has exist", modelName, path); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //如果模型的path发生改变, 需要注销掉原有的任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                unRegisterModel(modelName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // fail fast 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new RuntimeException(modelName + " already exists"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            String oldPath = modelPathMap.get(modelName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            if (path.equals(oldPath)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                //如果模型的path没有发生改变, 不做任何操作 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                log.info("Model [{}] and Path [{}] has exist", modelName, path); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                //如果模型的path发生改变, 需要注销掉原有的任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                unRegisterModel(modelName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         modelPathMap.put(modelName, path); 
			 |