浏览代码

TFS相关代码层次优化第三轮-完成

huangbo 8 年之前
父节点
当前提交
4bd0e61860

+ 1 - 1
display-server/src/main/java/com/ai/server/bean/UploadDownloadWithTfsBean.java

@ -21,8 +21,8 @@ import com.ai.ipu.server.servlet.ServletManager;
21 21
import com.ai.ipu.server.util.MobileServerException;
22 22
import com.ai.server.core.bean.IpuAppBean;
23 23
import com.ai.server.dao.FileDao;
24
import com.ai.server.tfs.DbFs;
24 25
import com.ai.server.util.Constant;
25
import com.ai.tfs.DbFs;
26 26
import com.ailk.common.data.IData;
27 27
import com.ailk.common.data.IDataset;
28 28
import com.ailk.common.data.impl.DataMap;

+ 118 - 0
display-server/src/main/java/com/ai/server/tfs/DbFs.java

@ -0,0 +1,118 @@
1
package com.ai.server.tfs;
2

3
import java.io.File;
4
import java.io.FileInputStream;
5
import java.io.OutputStream;
6

7
import com.ai.ipu.basic.cipher.MD5;
8
import com.ai.ipu.basic.file.FileUtil;
9
import com.ai.ipu.fs.impl.BaseFs;
10
import com.ai.ipu.fs.unique.IFsUnique;
11
import com.ai.ipu.fs.util.FsConstant;
12
import com.ai.ipu.fs.util.FsFactory;
13
import com.ai.ipu.fs.util.FsManager;
14

15
/**
16
 * @author chengwb3
17
 * 以MD5值为key的一系列操作,数据库存放记录
18
 */
19
public class DbFs extends BaseFs {
20
    private IFsUnique fsUnique;
21

22
    public DbFs() throws Exception {
23
        fsUnique = FsFactory.getFsUnique();
24
    }
25

26
    public String saveFile(String fileName) throws Exception {
27
        String md5 = MD5.hexDigestByFilePath(FsManager.getLocalFileName(fileName)); // 计算md5值是为了排重
28
        boolean bo = fsUnique.checkExists(md5);
29
        if (bo) {
30
        	return fsUnique.getFileKey(md5);
31
        } else {
32
        	String tfsFileHashCode = super.saveFile(fileName);
33
        	fsUnique.recordUnique(md5, tfsFileHashCode);// 上传排重时使用
34
			return tfsFileHashCode;
35
        }
36
    }
37

38
    @Override
39
    public String saveFile(FileInputStream fis) throws Exception {
40
        String md5 = MD5.hexDigest(fis); // 计算md5值是为了排重
41
        boolean bo = fsUnique.checkExists(md5);
42
        if (bo) {
43
        	return fsUnique.getFileKey(md5);
44
        } else {
45
        	String tfsFileHashCode = super.saveFile(fis);
46
            fsUnique.recordUnique(md5, tfsFileHashCode);// 上传排重时使用
47
            return tfsFileHashCode;
48
        }
49
    }
50

51
    /*
52
     * 通过fileHashCode获取文件,并转化为指定localFileName的文件
53
     * localFileName是绝对路径。例如:/home/ipuapp/web/deploy/8081 + / + ipu_file
54
     */
55
    @Override
56
    public boolean takeFile(String fileMd5, String localFileName) throws Exception {
57
    	String cacheFileName = FileUtil.connectFilePath(FsConstant.CACHE_DIRECTORY, fileMd5);
58
		File cacheFile = new File(FileUtil.connectFilePath(tfsFileHome, cacheFileName));
59
		String tfsFileHashCode = fsUnique.getFileKey(fileMd5);
60
        /*使用缓存文件需要先判断md5值是否相同*/
61
        if (needLocalFileCache && cacheFile.exists() && MD5.hexDigestByFile(cacheFile).equals(fileMd5)) {
62
            String localFullPath = FsManager.getLocalFileName(localFileName);
63
			FileUtil.initDirectory(localFullPath);//初始化目录,不用提前建好
64
			if(!FileUtil.checkFile(FsManager.getLocalFileName(localFileName))){
65
				/*CacheFile和LocalFile都在本地,不用每次写文件,提升性能!!!*/
66
				FileUtil.writeFile(new FileInputStream(cacheFile), localFullPath);
67
			}
68
            return true;
69
        } else {
70
        	/*没有目录先建目录*/
71
			localFileName = FileUtil.connectFilePath(tfsFileHome, localFileName);//全局目录
72
			FileUtil.initDirectory(localFileName);
73
			boolean bo = false;
74
			if(needLocalFileCache){
75
				cacheFileName = FileUtil.connectFilePath(tfsFileHome, cacheFileName);//全局目录
76
				FileUtil.initDirectory(cacheFileName);
77
				bo = super.takeFile(tfsFileHashCode, cacheFileName);//先下载到缓存目录下
78
				if (bo) {
79
					/*拷贝缓存目录到本地目录 */
80
					FileUtil.copyFile(cacheFileName, localFileName);
81
				}
82
			}else{
83
				bo = super.takeFile(tfsFileHashCode, localFileName);//先下载到本地目录下
84
			}
85
			return bo;
86
        }
87
    }
88

89
    @Override
90
    public boolean takeFile(String fileMd5, OutputStream out) throws Exception {
91
        String cacheFileName = FileUtil.connectFilePath(FsConstant.CACHE_DIRECTORY, fileMd5);
92
		File cacheFile = new File(FileUtil.connectFilePath(tfsFileHome, cacheFileName));
93
		String tfsFileHashCode = fsUnique.getFileKey(fileMd5);
94
		/*使用缓存文件需要先判断md5值是否相同*/
95
		if (needLocalFileCache && cacheFile.exists()&& MD5.hexDigestByFile(cacheFile).equals(fileMd5)) {
96
			FileUtil.writeFile(new FileInputStream(cacheFile), out);//是否需要内部关闭out输出流!!!
97
			return true;
98
		}else{
99
			/*没有目录先建目录*/
100
			cacheFileName = FileUtil.connectFilePath(tfsFileHome, cacheFileName);//全局目录
101
			FileUtil.initDirectory(cacheFileName);
102
			boolean bo = super.takeFile(tfsFileHashCode, cacheFileName);//先下载到缓存目录下
103
			if(bo){
104
				FileInputStream fis = new FileInputStream(cacheFileName);
105
				FileUtil.writeFile(fis, out);
106
			}
107
			return bo;
108
		}
109
    }
110

111
    public boolean deleteFile(String tfsFileHashCode) throws Exception {
112
        boolean bo = super.deleteFile(tfsFileHashCode);
113
        if (bo) {
114
            fsUnique.cleanUnique(tfsFileHashCode);
115
        }
116
        return bo;
117
    }
118
}

+ 26 - 27
display-server/src/main/java/com/ai/tfs/DbFsUnique.java

@ -1,8 +1,8 @@
1
package com.ai.tfs;
1
package com.ai.server.tfs;
2 2

3 3
import com.ai.ipu.basic.log.ILogger;
4 4
import com.ai.ipu.basic.log.IpuLoggerFactory;
5
import com.ai.ipu.fs.cache.IFsUnique;
5
import com.ai.ipu.fs.unique.IFsUnique;
6 6
import com.ai.server.dao.TfsMapDao;
7 7
import com.ai.server.util.Constant;
8 8
import com.ailk.common.data.IData;
@ -16,27 +16,25 @@ public class DbFsUnique implements IFsUnique {
16 16

17 17
    transient protected static final ILogger log = IpuLoggerFactory.createLogger(DbFsUnique.class);
18 18

19
    /*
19
    /**
20 20
     * 根据文件的md5,检测tfs是否包含此文件
21 21
     */
22 22
    @Override
23
    public String checkExists(String md5) {
24
        String fileHashCode = null;
25
        try {
26
            TfsMapDao dao = new TfsMapDao(Constant.CONNNAME);
27
            IData param = new DataMap();
28
            param.put("md5", md5);
29
            IDataset fileTfsList = dao.queryTfsMapTfsListByMd5(param);
30
            if (fileTfsList != null && !fileTfsList.isEmpty()) {
31
                fileHashCode = fileTfsList.getData(0).getString("file_hash_code");
32
            }
33
        }
34
        catch (Exception e) {
35
            e.printStackTrace();
36
            return fileHashCode;
37
        }
38
        return fileHashCode;
39
    }
23
	public boolean checkExists(String md5) {
24
		String fileHashCode = null;
25
		try {
26
			TfsMapDao dao = new TfsMapDao(Constant.CONNNAME);
27
			IData param = new DataMap();
28
			param.put("md5", md5);
29
			IDataset fileTfsList = dao.queryTfsMapTfsListByMd5(param);
30
			if (fileTfsList != null && !fileTfsList.isEmpty()) {
31
				fileHashCode = fileTfsList.getData(0).getString("file_hash_code");
32
			}
33
		} catch (Exception e) {
34
			e.printStackTrace();
35
		}
36
		return fileHashCode != null;
37
	}
40 38

41 39
    /*
42 40
     * 记录数据唯一性
@ -84,22 +82,23 @@ public class DbFsUnique implements IFsUnique {
84 82
        return true;
85 83
    }
86 84

87
    public static String getMd5ByFileHashCode(String fileHashCode) {
88
        String md5 = null;
85
	@Override
86
	public String getFileKey(String uniqueId) {
87
		// TODO Auto-generated method stub
88
		String fileHashCode = null;
89 89
        try {
90 90
            TfsMapDao dao = new TfsMapDao(Constant.CONNNAME);
91 91
            IData param = new DataMap();
92
            param.put("file_hash_code", fileHashCode);
92
            param.put("md5", uniqueId);
93 93
            IData tfsMapObj = dao.queryTfsMapListByFileHashCode(param);
94 94
            if (tfsMapObj != null) {
95
                md5 = tfsMapObj.getString("md5");
95
            	fileHashCode = tfsMapObj.getString("file_hash_code");
96 96
            }
97 97
        }
98 98
        catch (Exception e) {
99 99
            e.printStackTrace();
100
            return md5;
101 100
        }
102
        return md5;
103
    }
101
        return fileHashCode;
102
	}
104 103

105 104
}

+ 0 - 181
display-server/src/main/java/com/ai/tfs/DbFs.java

@ -1,181 +0,0 @@
1
package com.ai.tfs;
2

3
import java.io.File;
4
import java.io.FileInputStream;
5
import java.io.OutputStream;
6

7
import com.ai.ipu.basic.cipher.MD5;
8
import com.ai.ipu.basic.file.FileUtil;
9
import com.ai.ipu.fs.cache.IFsUnique;
10
import com.ai.ipu.fs.impl.BaseFs;
11
import com.ai.ipu.fs.util.FsConstant;
12
import com.ai.ipu.fs.util.FsFactory;
13

14
/**
15
 * @author chengwb3 以MD5值为key的一系列操作,数据库存放记录
16
 */
17
public class DbFs extends BaseFs {
18

19
    private String fsUniqueClassPath = "com.ai.tfs.DbFsUnique";
20

21
    private IFsUnique fsUnique;
22

23
    public DbFs() throws Exception {
24
        fsUnique = FsFactory.getFsUnique(fsUniqueClassPath);
25
    }
26

27
    public String saveFile(String fileName) throws Exception {
28
        String md5 = MD5.hexDigestByFilePath(getLocalFileName(fileName)); // 计算md5值是为了排重
29
        String tfsFileHashCode = fsUnique.checkExists(md5);
30
        if (tfsFileHashCode != null) {
31
            return tfsFileHashCode;
32
        } else {
33
            tfsFileHashCode = super.saveFile(fileName);
34
            fsUnique.recordUnique(md5, tfsFileHashCode);// 上传排重时使用
35
        }
36
        return tfsFileHashCode;
37
    }
38

39
    @Override
40
    public String saveFile(FileInputStream fis) throws Exception {
41
        String md5 = MD5.hexDigest(fis); // 计算md5值是为了排重
42
        String tfsFileHashCode = fsUnique.checkExists(md5);
43
        if (tfsFileHashCode != null) {
44
            return tfsFileHashCode;
45
        } else {
46
            tfsFileHashCode = super.saveFile(fis);
47
            fsUnique.recordUnique(md5, tfsFileHashCode);// 上传排重时使用
48
        }
49
        return tfsFileHashCode;
50
    }
51

52
    /*
53
     * 通过fileHashCode获取文件,并转化为指定localFileName的文件
54
     * localFileName是绝对路径。例如:/home/ipuapp/web/deploy/8081 + / + ipu_file
55
     */
56
    @Override
57
    public boolean takeFile(String tfsFileHashCode, String localFileName) throws Exception {
58
        String cacheFilePath = FileUtil.connectFilePath(FsConstant.CACHE_DIRECTORY, tfsFileHashCode);
59
        File cacheFile = new File(FileUtil.connectFilePath(tfsUploadFileHome, cacheFilePath));
60

61
        String md5 = DbFsUnique.getMd5ByFileHashCode(tfsFileHashCode);
62
        // 使用缓存文件需要先判断md5值是否相同
63

64
        if (needLocalFileCache && cacheFile.exists() && MD5.hexDigestByFile(cacheFile).equals(md5)) {
65
            FileUtil.initDirectory(localFileName);
66
            FileUtil.writeFile(new FileInputStream(cacheFile), localFileName);
67
            return true;
68
        } else {
69
            /* 没有目录先建目录 */
70
            FileUtil.initDirectory(FileUtil.connectFilePath(tfsUploadFileHome, cacheFilePath));
71
            FileUtil.initDirectory(localFileName);
72

73
            boolean bo = super.takeFile(tfsFileHashCode, cacheFilePath);// 先下载到缓存目录下
74
            if (bo) {
75
                FileUtil.copyFile(FileUtil.connectFilePath(tfsUploadFileHome, cacheFilePath), localFileName);
76
                fsUnique.recordUnique(md5, tfsFileHashCode);
77
            }
78
            return bo;
79
        }
80
    }
81

82
    // public boolean takeFile(String tfsFileHashCode, String localFileName)
83
    // throws Exception {
84
    // String cacheFilePath =
85
    // FileUtil.connectFilePath(FsConstant.CACHE_DIRECTORY, tfsFileHashCode);
86
    // File cacheFile = new File(FileUtil.connectFilePath(tfsUploadFileHome,
87
    // cacheFilePath));
88
    //
89
    // String md5 = DbFsUnique.getMd5ByFileHashCode(tfsFileHashCode);
90
    // // 使用缓存文件需要先判断md5值是否相同
91
    //
92
    // if (needLocalFileCache && cacheFile.exists() &&
93
    // MD5.hexDigestByFile(cacheFile).equals(md5)) {
94
    //
95
    // FileUtil.writeFile(new FileInputStream(cacheFile),
96
    // getLocalFileName(localFileName));
97
    // return true;
98
    // } else {
99
    // /* 没有目录先建目录 */
100
    // FileUtil.initDirectory(FileUtil.connectFilePath(tfsUploadFileHome,
101
    // cacheFilePath));
102
    // FileUtil.initDirectory(FileUtil.connectFilePath(tfsUploadFileHome,
103
    // localFileName));
104
    //
105
    // boolean bo = super.takeFile(tfsFileHashCode, cacheFilePath);// 先下载到缓存目录下
106
    // if (bo) {
107
    // FileUtil.copyFile(FileUtil.connectFilePath(tfsUploadFileHome,
108
    // cacheFilePath),
109
    // FileUtil.connectFilePath(tfsUploadFileHome, localFileName));
110
    // fsUnique.recordUnique(md5, tfsFileHashCode);
111
    // }
112
    // return bo;
113
    // }
114
    // }
115

116
    @Override
117
    public boolean takeFile(String tfsFileHashCode, OutputStream out) throws Exception {
118

119
        String cacheFilePath = FileUtil.connectFilePath(FsConstant.CACHE_DIRECTORY, tfsFileHashCode);
120
        File cacheFile = new File(FileUtil.connectFilePath(tfsUploadFileHome, cacheFilePath));
121

122
        String md5 = DbFsUnique.getMd5ByFileHashCode(tfsFileHashCode);
123
        // 使用缓存文件需要先判断md5值是否相同
124
        if (needLocalFileCache && cacheFile.exists() && MD5.hexDigestByFile(cacheFile).equals(md5)) {
125
            FileUtil.writeFile(new FileInputStream(cacheFile), out);// 是否需要内部关闭out输出流
126
            return true;
127
        } else {
128
            /* 没有目录先建目录 */
129
            FileUtil.initDirectory(FileUtil.connectFilePath(tfsUploadFileHome, cacheFilePath));
130

131
            boolean bo = super.takeFile(tfsFileHashCode, cacheFilePath);// 先下载到缓存目录下
132
            if (bo) {
133
                FileInputStream fis = new FileInputStream(FileUtil.connectFilePath(tfsUploadFileHome, cacheFilePath));
134
                FileUtil.writeFile(fis, out);
135
                fsUnique.recordUnique(md5, tfsFileHashCode);
136
            }
137

138
            return bo;
139
        }
140
    }
141

142
    // public boolean takeFile(String tfsFileHashCode, OutputStream out) throws
143
    // Exception {
144
    //
145
    // String cacheFilePath =
146
    // FileUtil.connectFilePath(FsConstant.CACHE_DIRECTORY, tfsFileHashCode);
147
    // File cacheFile = new File(FileUtil.connectFilePath(tfsUploadFileHome,
148
    // cacheFilePath));
149
    //
150
    // String md5 = DbFsUnique.getMd5ByFileHashCode(tfsFileHashCode);
151
    // // 使用缓存文件需要先判断md5值是否相同
152
    // if (needLocalFileCache && cacheFile.exists() &&
153
    // MD5.hexDigestByFile(cacheFile).equals(md5)) {
154
    // FileUtil.writeFile(new FileInputStream(cacheFile), out);// 是否需要内部关闭out输出流
155
    // return true;
156
    // } else {
157
    // /* 没有目录先建目录 */
158
    // FileUtil.initDirectory(FileUtil.connectFilePath(tfsUploadFileHome,
159
    // cacheFilePath));
160
    //
161
    // boolean bo = super.takeFile(tfsFileHashCode, cacheFilePath);// 先下载到缓存目录下
162
    // if (bo) {
163
    // FileInputStream fis = new
164
    // FileInputStream(FileUtil.connectFilePath(tfsUploadFileHome,
165
    // cacheFilePath));
166
    // FileUtil.writeFile(fis, out);
167
    // fsUnique.recordUnique(md5, tfsFileHashCode);
168
    // }
169
    //
170
    // return bo;
171
    // }
172
    // }
173

174
    public boolean deleteFile(String tfsFileHashCode) throws Exception {
175
        boolean bo = super.deleteFile(tfsFileHashCode);
176
        if (bo) {
177
            fsUnique.cleanUnique(tfsFileHashCode);
178
        }
179
        return bo;
180
    }
181
}

+ 26 - 24
display-server/src/main/resources/tfs.xml

@ -1,27 +1,29 @@
1 1
<?xml version="1.0" encoding="UTF-8"?>
2 2
<configs>
3
      <!-- 整个进程中系统最多等待多少个请求,取决于你有多少个线程并发的请求TFS -->
4
       <config name="maxWaitThread" value="1000"/>
5
      <!-- 单个请求最大的等待时间(ms) 超过这个时间放弃这次请求-->
6
      <config name="timeout" value="20000"/>
7
      <!-- Tfs master nameserver ip address -->
8
      <config name="nsip" value="114.215.100.48:8100"/>
9
      <!-- TFS在读取文件的时候会缓存block所在的数据服务器ip,这个参数配置了最多缓存的记录个数!-->
10
      <config name="maxCacheItemCount" value="10000"/>
11
      <!-- 上一项缓存最大有效的时间(ms)!-->
12
      <config name="maxCacheTime" value="50000"/>
13
      <!-- tfs保存失败后最大重试次数-->
14
      <config name="maxTryNum" value="3"/>
15
      <!-- tfs本地文件存放的根目录 -->
16
      <config name="uploadFileHome" value="/home/ipuapp/web/webapps/display"/>
17
      <!-- 是否开启本地文件缓存。缺省为true,开启。不想开启需要设置为false -->
18
      <config name="localFileCached" value="false"/>
19
      
20
      <!-- 不需要排重功能时,下面配置项可以不设置 -->
21
      <!-- tair排重数据库的serverlist -->
22
      <config name="uniqueServerList" value="192.168.233.141:5188,192.168.233.141:5198"/>
23
      <!-- tair排重数据库的groupName -->
24
      <config name="groupName" value="group_1"/>
25
       <!-- tair排重数据库的namespace -->
26
      <config name="namespace" value="102"/>
3
	<!-- 整个进程中系统最多等待多少个请求,取决于你有多少个线程并发的请求TFS -->
4
	<config name="maxWaitThread" value="1000" />
5
	<!-- 单个请求最大的等待时间(ms) 超过这个时间放弃这次请求 -->
6
	<config name="timeout" value="20000" />
7
	<!-- Tfs master nameserver ip address -->
8
	<config name="nsip" value="114.215.100.48:8100" />
9
	<!-- TFS在读取文件的时候会缓存block所在的数据服务器ip,这个参数配置了最多缓存的记录个数! -->
10
	<config name="maxCacheItemCount" value="10000" />
11
	<!-- 上一项缓存最大有效的时间(ms)! -->
12
	<config name="maxCacheTime" value="50000" />
13
	<!-- tfs保存失败后最大重试次数 -->
14
	<config name="maxTryNum" value="3" />
15
	<!-- tfs本地文件存放的根目录 -->
16
	<config name="uploadFileHome" value="/home/ipuapp/web/webapps/display" />
17
	<!-- 是否开启本地文件缓存。缺省为true,开启。不想开启需要设置为false -->
18
	<config name="localFileCached" value="false" />
19

20
	<!-- 不需要排重功能时,下面配置项可以不设置 -->
21
	<!-- tair排重数据库的serverlist -->
22
	<config name="uniqueServerList" value="192.168.233.141:5188,192.168.233.141:5198" />
23
	<!-- tair排重数据库的groupName -->
24
	<config name="groupName" value="group_1" />
25
	<!-- tair排重数据库的namespace -->
26
	<config name="namespace" value="102" />
27
	
28
	<config name="fsUniqueClass" value="com.ai.server.tfs.DbFsUnique" />
27 29
</configs>