赞
踩
客户端通常指的是我们的java程序,去连接FastDFS,操作FastDFS,那我们的java程序就是一个客户端,
主要由两部分组成,
跟踪器主要作调度工作,在内存中记录集群中存储节点storage的状态信息,是前端Client和后端storage的枢纽。相关信息都存储在内存中了,所以Tracker Server的性能非常高, 一个较大的集群(如上百个group中)有3台就够了。
存储节点用于存储文件,包括文件和文件属性, 都会保存到服务器的磁盘上,完成文件的管理功能:文件存储、文件同步、提供文件访问等。
在usr/bin目录下 存在很多fastXXX文件夹 在bin目录下 说明我们可以在任何目录下运行fastDFS的命令
在etc/fdfs目录下, 存放的是fastDFS的配置文件
另外注意需要把解压后的fastdfs-5.11/conf目录下的两个文件拷贝到/etc/fdfs/ ,否则后续会有很多奇怪问题不好解决
cp http.conf /etc/fdfs/
cp mime.types /etc/fdfs/
这两个文件后续需要用到,所以先拷贝过去
fastDFS没有提供windows版的安装 只能在linux下安装进行。
因为默认的设置下 会给你添加sample后缀名
将tracker.conf 和storage.conf 修改文件扩展名 以及 配置文件内容
默认指向的FastDFS作者余庆的目录,因为在我们的机器上不存在,所有手动改一下
文件路径是在etc/fdfs下 因为是配置文件路径
base_path=/opt/fastdfs/storage #配置storage log文件存储数据的目
tracker_server = 192.168.0.102:22122 #注册当前存储节点的跟踪器地址
store_path0=/opt/fastdfs/storage/files # 配置真正存放文件的目录
bind_addr=192.168.0.102 这里在本地的话 也一并修改了
# the base path to store data and log files
base_path=/opt/fastdfs/tracker#配置tracker存储数据的目
以上的设置目录一定是存在的
在任意目录下执行 fdfs_trackerd
会提示 fdfs_trackerd <config_file> [strat | stop | restart]
fdfs_trackerd /etc/fdfs/tracker.conf
fdfs_storaged /etc/fdfs/storage.conf
ps -ef | grep fdfs
可以查看日志 /opt/fastdfs/storage/logs
在/opt/fastdfs/storage/files/data 路径下 可以查看子目录 65535 = 256* 256
base_path=/opt/fastdfs/client
tracker_server=192.168.0.102:22122
执行上传命令fdfs_test /etc/fdfs/client.conf upload /root/a.txt
原因在于 原因1:缺少相应的jar包,导致@Mapper注解无效
- <dependency>
-
- <groupId>org.mybatis.spring.boot</groupId>
-
- <artifactId>mybatis-spring-boot-starter</artifactId>
-
- <version>1.2.0</version>
-
- </dependency>
通过查找maven安装路径maven/conf/settings.xml的参数可以知道
在执行mybatis-逆向工程的时候提示Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate
原因归结于
注意修改generatorConfig.xml的location:
- <generatorConfiguration>
- <classPathEntry
- location="C:\Users\zhaoliang\.m2\repository\mysql\mysql-connector-java\5.1.40\mysql-connector-java-5.1.40.jar"/>
将 / 修改为 \ 配置正确
将之前pom.XML中的mysql依赖替换了一下就可以了
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>替换为
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.13</version>
</dependency>换个版本号就对了
检查一下 jdbc的url地址 是否没有加 ://
@RequestParam 将请求参数绑定到控制器的方法上 是spingMVC接收普通参数的注解
语法 @RequestParam(value = " " , required= true/false , defaultValue=" ")
其中 value 参数名
required = true/false 是否包含该参数 ,默认为true 表示controller请求路径中必须包含该参数, 不包含就会报错 如果设置了 false 则有的话就ok 没有的话就会显示null 但不会报错
defaultValue 参数默认的值, 如果设置了该值 则 required=true 失效, 当没有设置value参数的时候,自动为false, 会自动填充该值进去
base_token实体类中
time | token | content | cons | has | pas | create_time | del_flg | last_create_time | is_use |
时间 | token内容 | 包含信息 | 时间戳 | 短值 | 解析密码 | 创建时间 | 删除标志位 | 最后更新时间 | 是否启用1:启用 0:暂停 |
base_library实体类中
library_key | name | times | dirs | create_time | del_flg | public_api | user_id |
语料库key | 名称 | 语料库创建时间 | 语料库是否为空 | 创建时间 | 删除标志位 | 预处理时使用api接口 | 用户id |
base_corpus实体类 与library靠 library_id来关联
name | type | library_id | times | file_type | create_time | del_flg | file_path | file_name | file_url |
语料库文件名称 | 1生语料2半熟语料3熟语料 | 语料库id | 创建时间 | 文件类型 | 创建时间 | 删除标志位 | 文件地址 | 文件名称 | 文件URL地址 |
addCorpus的逻辑
获取token中包含的信息 并进行语料库数据字段的设置 判断接收的参数 Token
new baseToken()
setHas值为接收参数的token
利用mybatis.plus查询该token的信息
获取到该token信息后 进行判断 是否为空 if == null errorUtil.Error(“错误”)
JSON.parseObject(token.getContent()) 获取token的包含信息 并进行解析JSONObject user = JSON.parseObject(obs.getString("user")) 再对解析出来的content解析 user的信息出来创建语料库 判断接收的参数 LibraryName
new BaseLibrary()
setName(libraryName 该值是参数传递过来的值)
设置完Library后进行判断 是否已经存在该名称的library SELECT COUNT(1) FROM base_library WHERE (del_flg != 0) AND (name = ? )
如果有提示 语料库名称重复
再判断files文件
if files==null || files.size() ==0
library.setDirs(yes) 设置语料库内容是否为空
library.setLibraryKey(UUID.randomUUID().toString().replace("_",""));setLibraryKey (UUID)
setPulicApi
setTime new Date
setUserId(user.getID)
save
new FileRes 文件返回信息类
setLibrary进去
setCorpus进去 最后返回该类信息 前端读到的就是 语料库名字+ 语料库信息+ 预料信息 注意 语料库中可以存在多个语料的
添加语料
判断文件是否为空或者size为0
然后遍历文件数据 当然可能size >=1 所以需要遍历
x.getOriginalFilename() 得到文件名再得到文件类型 (后缀名)
再进行判断 如果后缀名是zip的话 需要进行解压缩
不是zip文件的话
上传到服务器
fastDFSClient.uploadFileWithMultipart(x)TrackerServer trackerServer = TrackerServerPool.borrowObject(); TrackerServerPool获取TrackerServerStorageClient1 storageClient = new StorageClient1(trackerServer, null); 再根据TrackerServer创建StorageClient// 读取流// 上传path = storageClient.upload_file1(fileBuff, suffix, nvps);返回的值path 是个string[] 包含了 group1 url地址 再进行url地址的拼接
对返回的path值进行判断 如果isBlank 则抛出异常 文件上传失败
然后再log中添加信息
if (logger.isDebugEnabled()) { logger.debug("upload file success, return path is {}", path); }在文件上传模块 添加try catch finally模块
finally模块 关闭数据流
然后外部 返还Tracker数据池对象
// 返还对象 TrackerServerPool.returnObject(trackerServer);跳出来
BaseCorpus corpus = new BaseCorpus()setFileName( x. getOriginalFileName)
setFIlePath( 是fastDFSClient upload之后返回的拼接路径地址)
setFileType(文件的后缀名字 如txt)
setLibraryId (library.getID)
setName( x. getOriginalFileName)
setTime(new Date())
setType(1) 写死的一个生语料
corpus.insert() save
在上面还创建了一个arrayList类型变量 corpusList corpusList.add(corpus) 同样的语料也不只是一个 所以声明一个list变量来存储
fileRes = new FileRes() 里面只有两个字段 一个是 Library 语料库信息 一个是 corpusList 语料库语料信息最后 将corpusList 和 library 都存储在 fileRes中 作为返回值 return
addFileForLibrary上传语料到语料库的逻辑
参数值是 token libraryKey type(语料类型) files语料文件
new BaseToken()
setHas(参数token)
进行验证token
解析获取到的token字段值 将content内容提取 再将user内容从content中提取
在设置corpus 的type==3的时候 分别去设置 其type=2 type=3 在数据库中进行检索 如果存在的话 就对其进行delete
在接收的参数=2 的时候 不允许直接上传半熟语料
同样的 在上传的时候 去判断fileType 1生 2 半熟 3 熟语料
判断3的时候 先上传到服务器 然后在fastDFSclient返回的path中取出值来 setFilePath setFileType等 再去存储数据库 与删除的时候逻辑相同 删除的时候一定要先删fdfs再去删除数据库 不然会导致野文件出现
另外,找到的 上传语料到语料库的代码中 查询到一个错误 378行 fastDFSClient.deleteFile后 并没有更新数据库(考虑将url地址设置为null 不将其删除)
考虑到模型更新这个任务, 需要保留这样的模型 然后评比之后再进行删除 ? 这样的话其实也没有啥用 并不会保留文件数据 只是在数据库中存下了一些关于 name type libraryId的字段而已 索性直接删除吧
语料库预处理逻辑述理(corpusBefore):
传递的参数是 libraryKey 和 token
libraryKey是 语料库的id 当然一个语料库中包含很多个语料
一开始同样的,根据token来获取了 用户的id
再根据用户的id来获取 library的key值
根据LibraryKey值来查询是否 语料库不存在
然后再根据语料库key值 查询出library中存在的corpus
corpus中是没有publicAPI的
所以 JSONObject jsonObject = new JSONObject();jsonObject.put("publicApi",library.getPublicApi()); jsonObject.put("libraryKey",libraryKey); jsonObject.put("token",token);FeignClient注解 使用了HanLP_v1的一些方法进行了预处理
也没有将数据库中的数据进行delete 不知道其设计是怎样的 待咨询
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。