Code Monkey home page Code Monkey logo

fastdfs_client's Introduction

FastDFS-Client 1.27.2(2020-2-11)

This is a java client lib for FastDFS.

介绍

在原作者YuQing与yuqih发布的java客户端基础上进行了大量重构工作,便于Java工作者学习与阅读。

当前客户端单元测试全部通过,服务端版本是FastDFS_V5.07

主要特性

  1. 对关键部分代码加入了单元测试,便于理解与服务端的接口交易,提高接口质量
  2. 将以前对byte硬解析风格重构为使用 对象+注解 的形式,尽量增强了代码的可读性
  3. 支持对服务端的连接池管理(commons-pool2)
  4. 支持上传图片时候检查图片格式,并且自动生成缩略图
  5. 在SpringBoot当中自动导入依赖

参考文档

想要学习掌握更多FastDFS的架构原理可以参考本项目文档.

修改日志

版本更新情况请查看修改日志

运行环境要求

由于笔者主要工作环境是SpringBoot,因此目前客户端主要依赖于SpringBoot

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath />
  • JDK环境要求 1.8
  • FastDFS服务端 5.07 测试通过

单元测试

由于工作时间关系与解析原代码的复杂性,单元测试无法完全做到脱离FastDFS服务端,请见谅。

执行单元测试需要配置TestConstants文件当中参数

在Tracker与Storage都在一个机器的环境下

  private static String ip_home = "192.168.1.105";
  public static InetSocketAddress address = new InetSocketAddress(ip_home, FdfsMockSocketServer.PORT);
  public static InetSocketAddress store_address = new InetSocketAddress(ip_home, FdfsMockSocketServer.STORE_PORT);
  
  public static final String DEFAULT_STORAGE_IP = ip_home;

在Tracker与Storage不在一个机器的环境下

private static String ip_work = "192.168.174.47";
private static String ip_work_store = "192.168.174.49";
public static InetSocketAddress address = new InetSocketAddress(ip_work, FdfsMockSocketServer.PORT);
public static InetSocketAddress store_address = new InetSocketAddress(ip_work_store, FdfsMockSocketServer.STORE_PORT);

public static final String DEFAULT_STORAGE_IP = ip_work_store;

FastDFS-Client使用方式

1.在项目Pom当中加入依赖

Maven依赖为

<dependency>
    <groupId>com.github.tobato</groupId>
    <artifactId>fastdfs-client</artifactId>
    <version>1.27.2</version>
</dependency>

2.将Fdfs配置引入项目

在Maven当中配置依赖以后,SpringBoot项目将会自动导入FastDFS依赖(感谢@Lzgabel)。

FastDFS-Client 1.26.4版本以前引入方式

将FastDFS-Client客户端引入本地化项目的方式非常简单,在SpringBoot项目/src/[com.xxx.主目录]/conf当中配置

/**
 * 导入FastDFS-Client组件
 * 
 * @author tobato
 *
 */
@Configuration
@Import(FdfsClientConfig.class)
// 解决jmx重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class ComponetImport {
    // 导入依赖组件
}

只需要一行注解 @Import(FdfsClientConfig.class)就可以拥有带有连接池的FastDFS Java客户端了。

注意:@EnableMBeanExport解决问题JMX重复注册问题,issue #8 issue #18,不要再配置 spring.jmx.enabled=false,以免影响SpringBoot默认的JMX监控。

3.在application.yml当中配置Fdfs相关参数

# ===================================================================
# 分布式文件系统FDFS配置
# ===================================================================
fdfs:
  so-timeout: 1501
  connect-timeout: 601 
  thumb-image:             #缩略图生成参数
    width: 150
    height: 150
  tracker-list:            #TrackerList参数,支持多个
    - 192.168.1.105:22122
    - 192.168.1.106:22122 

4.连接池的管理参数

应用启动后拥有两个连接池管理对象:

  • Tracker连接池(TrackerConnectionManager)
  • Storage连接池(FdfsConnectionManager)

必要的时候可以注入这两个对象,跟踪打印并分析连接池的情况

两个连接池的参数配置一致,可参考 ConnectionPoolConfig 与 apache.pool2 进行优化配置,默认配置为

fdfs:
   ..其他配置信息..
  pool:
    #从池中借出的对象的最大数目(配置为-1表示不限制)
    max-total: -1
    #获取连接时的最大等待毫秒数(默认配置为5秒)
    max-wait-millis: 5*1000
    #每个key最大连接数
    max-total-per-key: 50
    #每个key对应的连接池最大空闲连接数
    max-idle-per-key: 10
    #每个key对应的连接池最小空闲连接数
    min-idle-per-key: 5

注意: key配置的是连接服务端的地址(IP+端口)连接情况,如果有连接不够用的情况可以调整以上参数

4.使用接口服务对Fdfs服务端进行操作

主要接口包括

  1. TrackerClient - TrackerServer接口
  2. GenerateStorageClient - 一般文件存储接口 (StorageServer接口)
  3. FastFileStorageClient - 为方便项目开发集成的简单接口(StorageServer接口)
  4. AppendFileStorageClient - 支持文件续传操作的接口 (StorageServer接口)

常见问题

1.如何在没有spring-boot的情况下使用?

参考下面文章进行改造

https://blog.csdn.net/wzl19870309/article/details/74049204

2.高并发下测试出现上传的文件和得到的返回路径的文件不是同一个?

通过加大超时时间后解决

soTimeout: 1500
connectTimeout: 600

3.新手不会用

阅读单元测试,从学习test/java/com/github/tobato/fastdfs/service下的单元测试入手

4.生成的缩略图怎么访问?

缩略图为上传文件名+缩略图后缀(默认_150x150)

如:源图上传后路径为 xxx.jpg,缩略图为 xxx_150x150.jpg

源图 http://localhost:8098/M00/00/17/rBEAAl33pQaAWNQNAAHYvQQn-YE374.jpg
缩略图 http://localhost:8098/M00/00/17/rBEAAl33pQaAWNQNAAHYvQQn-YE374_150x150.jpg

5.返回的文件名看起来乱糟糟的,能自定义文件名吗?能指定上传路径吗?

上传以后的文件名是FastDfs服务端根据一定规则生成的,不可以修改文件名,因此也不可以由客户端指定上传的路径。 客户端只能控制把文件上传到哪一个分组(Group).

一般处理方法是把服务端返回的文件路径记录到数据库里,自己按需要在数据库里再记录一个便于识别的文件名。

6.请问当上传100M以上文件怎么才能获取进度?

FastDFS设计是用来存储小文件的,过大的文件处理方案是拆分为小文件,可跟踪小文件的上传情况。 如果应用场景都是处理大文件,可能选择其他分布式文件系统方案会更合适。

7.文件扩展名字数长度限制?

我需要上传文件扩展名很长的文件到fastdfs,但是发现扩展名总是会被截取,追了一下发现是Constants限制了FDFS_FILE_EXT_NAME_MAX_LEN = 6 ,请问这个参数可以配置吗?应该怎么修改呢? 在我将otherConstants类里的FDFS_FILE_EXT_NAME_MAX_LEN的值从6改到16时, 尝试传一张后缀长的文件时,会报错无效参数, 原因是服务器上的fastDFS源码(c语言编写的那个)的commons包下fdfs_global.h中FDFS_FILE_EXT_NAME_MAX_LEN=6, 于是将6改为16, make.sh重新编译后, 解决了传后缀长文件的问题(#157 感谢@787390869提供解答)

其他参考资料

对于FDFS服务端相关的问题可以在下面的论坛找到一些材料

FastDFS论坛

FastDFS常见问题

fastdfs_client's People

Contributors

bluishoul avatar dependabot[bot] avatar doyutu avatar enchigo avatar happyomg avatar jlleitschuh avatar tobato avatar xiaolizi555666 avatar xlb avatar yingzhuo avatar zer0black avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fastdfs_client's Issues

非spring-boot项目怎么使用

1.我是非spring-boot项目怎么使用你的client;
2.上传、下载接口是否可以再丰富些,比如上传api官网的client是不需要传groupName,client自动获取

感谢!

报错:BeanCreationException: 有mbeanExporter和endpointMBeanExporter两个bean

Description:

Constructor in org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration required a single bean, but 2 were found:
- mbeanExporter: defined by method 'mbeanExporter' in org.springframework.context.annotation.MBeanExportConfiguration
- endpointMBeanExporter: defined by method 'endpointMBeanExporter' in class path resource [org/springframework/boot/actuate/autoconfigure/EndpointMBeanExportAutoConfiguration.class]

Action:

Consider marking one of the beans as @primary, updating the consumer to accept multiple beans, or using @qualifier to identify the bean that should be consumed

配置多个tracker有问题

配置多个tracker,然后关掉其中一个tracker服务,文件上传时会报错,提示连接不到关掉的那个tracker服务。

FdfsIOException socket io

com.github.tobato.fastdfs.exception.FdfsIOException: 客户端连接服务端出现了io异常:socket io exception occured while receive content

/**

  • 对服务端发出请求然后接收反馈
    */
    public T execute(Connection conn) {
    // 封装socket交易 send
    try {
    send(conn.getOutputStream(), conn.getCharset());
    } catch (IOException e) {
    LOGGER.error("send conent error", e);
    throw new FdfsIOException("socket io exception occured while sending cmd", e);
    }

跟踪此处跳出异常:java.net.SocketException: Software caused connection abort: socket write error

重启tracker以后连接好像丢失了

2017-11-21 15:58:14,670 DEBUG - [对地址/192.168.0.242:22122发出交易请求TrackerListStoragesCommand]
2017-11-21 15:58:14,671 DEBUG - [发出交易请求..报文头为ProtoHead [contentLength=16, cmd=92, status=0]]
2017-11-21 15:58:14,672 DEBUG - [服务端返回报文头ProtoHead [contentLength=88, cmd=-25, status=119]]
2017-11-21 15:58:14,672 ERROR - [receive conent error]
java.io.IOException: recv cmd: -25 is not correct, expect cmd: 100
at com.github.tobato.fastdfs.proto.ProtoHead.validateResponseHead(ProtoHead.java:116)
at com.github.tobato.fastdfs.proto.AbstractFdfsCommand.receive(AbstractFdfsCommand.java:102)
at com.github.tobato.fastdfs.proto.AbstractFdfsCommand.execute(AbstractFdfsCommand.java:45)
at com.github.tobato.fastdfs.conn.ConnectionManager.execute(ConnectionManager.java:76)
at com.github.tobato.fastdfs.conn.TrackerConnectionManager.executeFdfsTrackerCmd(TrackerConnectionManager.java:72)
at com.github.tobato.fastdfs.service.impl.DefaultTrackerClient.listStorages(DefaultTrackerClient.java:91)

多线程上传图片是 返回图片地址混乱

多线程上传图片是 返回图片地址混乱 时不时发生
code:
...........
@Autowired
private FastFileStorageClient storageClient;
.........

public synchronized String uploadFile(byte[] buffer, String extension) {

	StorePath storePath = storageClient.uploadFile(groupName, new ByteArrayInputStream(buffer), buffer.length, extension);

    return .........
}

现没办法加上了 synchronized

断点续传的问题

现在这个客户端是追加的方式,第一片uploadAppenderFile,后面的appendFile。但是如果是多线程的,没有顺序怎么处理呀?可以用类似RandomAccessFile吗?这里面有偏移量的说法吗?

mavne地址错误

作者在文档中是1.26.2-RELEASE,我去**仓库查了一下1.26.x只有1.26.2和1.26.1-RELEASE两个版本,希望修改一下文档信息,希望作者项目越来越好。

FdfsParamMapper报错

在使用过程中,发现有一个异常,具体错误信息如下,好像这是一个潜在的bug,应该是在反射的时候出错了。不知道怎么修复了。
Caused by: java.lang.RuntimeException: execute fdfs command error
at com.github.tobato.fastdfs.conn.ConnectionManager.execute(ConnectionManager.java:78)
at com.github.tobato.fastdfs.conn.ConnectionManager.executeFdfsCmd(ConnectionManager.java:58)
at com.github.tobato.fastdfs.service.DefaultFastFileStorageClient.uploadFileAndMetaData(DefaultFastFileStorageClient.java:78)
at com.github.tobato.fastdfs.service.DefaultFastFileStorageClient.uploadFile(DefaultFastFileStorageClient.java:41)
at com.touna.storageapi.common.FastdfsClient2.uploadFile(FastdfsClient2.java:211)
... 57 more
Caused by: com.github.tobato.fastdfs.proto.mapper.FdfsColumnMapException: java.lang.IllegalAccessException: Class com.github.tobato.fastdfs.proto.mapper.FdfsParamMapper can not access a member of class java.lang.Void with modifiers "private"
at com.github.tobato.fastdfs.proto.mapper.FdfsParamMapper.map(FdfsParamMapper.java:52)
at com.github.tobato.fastdfs.proto.FdfsResponse.decode(FdfsResponse.java:54)
at com.github.tobato.fastdfs.fastdfs.proto.AbstractFdfsCommand.receive(AbstractFdfsCommand.java:105)
at com.github.tobato.fastdfs.proto.AbstractFdfsCommand.execute(AbstractFdfsCommand.java:45)
atcom.github.tobato.fastdfs.conn.ConnectionManager.execute(ConnectionManager.java:73)
... 61 more
Caused by: java.lang.IllegalAccessException: Class com.github.tobato.fastdfs.proto.mapper.FdfsParamMapper can not access a member of class java.lang.Void with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:109)
at java.lang.Class.newInstance(Class.java:373)
at com.github.tobato.fastdfs.proto.mapper.FdfsParamMapper.mapByIndex(FdfsParamMapper.java:89)
at com.github.tobato.fastdfs.proto.mapper.FdfsParamMapper.map(FdfsParamMapper.java:46)
... 66 more

spring boot 2.0.0.RC1 报错

Description:

Configuration property name 'fdfs.thumbImage' is not valid:

Invalid characters: 'I'
Bean: defaultThumbImageConfig
Reason: Canonical names should be kebab-case ('-' separated), lowercase alpha-numeric characters and must start with a letter

Action:

Modify 'fdfs.thumbImage' so that it conforms to the canonical names requirements.

前缀不能有大写字母 要用 ‘-’ 隔开

无法获取服务端连接资源:找不到可用的tracker

我的配置,Configuration类也写了

fdfs:
  so-timeout: 1501
  connect-timeout: 601
  thumb-image:             #缩略图生成参数
    width: 150
    height: 150
  tracker-list:            #TrackerList参数,支持多个
    - 192.168.103.228:22122
  pool:
    max-total: 150         #从池中借出的对象的最大数目
    max-wait-millis: 100   #获取连接时的最大等待毫秒数100

注入到AccessoryEndpointClient

private FastFileStorageClient fastFileStorageClient;

public AccessoryEndpointClient(@Qualifier("defaultFastFileStorageClient")FastFileStorageClient fastFileStorageClient) {
        this.fastFileStorageClient = fastFileStorageClient;
    }

测试类

@Test
public void asyncUpload() throws Exception {
    MockMultipartFile multipartFile = new MockMultipartFile("file", "test.txt", "text/plain", "Test File".getBytes());

    GenerateAccessoryDTO dto = new GenerateAccessoryDTO();
    dto.setAppId("1");
    dto.setDataId("1");
    dto.setServiceId("1");
    dto.setsCmpy("1");
    dto.setsDept("1");
    dto.setsDeptPath("1");
    dto.setsOdept("1");

    Accessory accessory = new Accessory();
    BeanUtils.copyProperties(dto, accessory);
    Accessory generatedAccessory = accessoryRepository.saveAndFlush(accessory);

    String signature = generatedAccessory.getId();

    mockMvc.perform(fileUpload("/api/upload/async")
        .file(multipartFile)
        .param("signature",signature)
        .with(oAuth2TokenMockUtil.oauth2Authentication("login", mockScopes, mockRoles)))
        .andExpect(status().isOk())
        .andDo(print());
}

报错

2018-04-28 11:09:28.070 ERROR 22758 --- [           main] c.g.t.fastdfs.conn.ConnectionManager     : Unable to borrow buffer from pool

com.github.tobato.fastdfs.exception.FdfsUnavailableException: 无法获取服务端连接资源:找不到可用的tracker 
	at com.github.tobato.fastdfs.domain.TrackerLocator.getTrackerAddress(TrackerLocator.java:103)
	at com.github.tobato.fastdfs.conn.TrackerConnectionManager.executeFdfsTrackerCmd(TrackerConnectionManager.java:64)
	at com.github.tobato.fastdfs.service.DefaultTrackerClient.getStoreStorage(DefaultTrackerClient.java:39)
	at com.github.tobato.fastdfs.service.DefaultFastFileStorageClient.uploadFile(DefaultFastFileStorageClient.java:53)
	at com.cplh.dfs.service.AccessoryEndpointClient.asyncUpload(AccessoryEndpointClient.java:81)
	at com.cplh.dfs.web.rest.AccessoryResource.uploadFile(AccessoryResource.java:90)
	at com.cplh.dfs.web.rest.AccessoryResource$$FastClassBySpringCGLIB$$ddd04735.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:69)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at com.ryantenney.metrics.spring.TimedMethodInterceptor.invoke(TimedMethodInterceptor.java:48)
	at com.ryantenney.metrics.spring.TimedMethodInterceptor.invoke(TimedMethodInterceptor.java:34)
	at com.ryantenney.metrics.spring.AbstractMetricMethodInterceptor.invoke(AbstractMetricMethodInterceptor.java:59)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)

大佬帮看下可能是哪里出问题了

FastFileStorageClient如何下载文件?异步回调函数中的流是未完成的状态

@GetMapping("/download") public Object getDown() throws Exception{ Object downloadFile = client.downloadFile("group1", "M00/00/00/CgoIblomae6ABaWxAAAAyLvNaSM.proper",new DownloadCallback<Object>() { @Override public Object recv(InputStream ins) throws IOException { FdfsInputStream fis = (FdfsInputStream) ins; System.err.println(fis.isReadCompleted()); return ins; } }); FdfsInputStream fis = (FdfsInputStream)downloadFile; while(!fis.isReadCompleted()){ Thread.sleep(20); } return downloadFile; }
流的状态一直是uncompleted,而且方法需要提供回调,那在controller如何返回流,异步请求?
github源码中提供的测试案例FastFileStorageClientTest没有文件下载,一般下载文件不是要经过服务后台吗,还是说借助浏览器的下载功能?

com.github.tobato.fastdfs.exception.FdfsIOException: 客户端连接服务端出现了io异常:socket io exception occured while sending cmd

java.io.IOException: the end of the stream has been reached. not match the expected size
com.github.tobato.fastdfs.exception.FdfsIOException: 客户端连接服务端出现了io异常:socket io exception occured while sending cmd
2017-11-23 23:02:32.027 ERROR 26023 --- [l-EvictionTimer] c.g.t.fastdfs.conn.DefaultConnection : valid connection error java.net.SocketTimeoutException: Read timed out
上面是错误栈打印的,场景是我读取邮件的附件,并将邮件附件上传到FDFS上,使用storageClient.uploadFile这个方法时就报错,通过debug知道附件的inputstream是Base64DecoderStream,不知道和这个有没有关系,请问这是哪方面问题

SocketTimeout or recv cmd: 0 is not correct, expect cmd: 100

你好 我使用你的代码配置进行fastdfs上传,随机报错信息如下:

要么 并发冲突:recv cmd: 0 is not correct, expect cmd: 100

要么

....FdfsIOException:客户端连接服务端出现了io异常:socket io exception occured while receive content at
.......
Caused by: java.net.SocketTimeoutException: Read timed out

请问是我的配置问题 还是我的FastDFS问题呢

上传从文件报错

上传从文件的时候报错:
com.github.tobato.fastdfs.exception.FdfsServerException: 错误码:22,错误信息:无效的参数
上传代码
StorePath storePath = storageClient.uploadSlaveFile(“groupimg","groupimg/M00/01/55/wKgBDFgzuOiAHF5mAAG_Zqq_-Jc030.jpg",FileUtils.openInputStream(slaveFile),slaveFile.length(),prefixName,fileExtName);
服务端报错:
[2016-11-22 11:43:11] ERROR - file: ../common/fdfs_global.c, line: 52, the format of filename "groupimg/M00/01/55/wKgBDFgzuOiAHF5mAAG_Zqq_-Jc030.jpg" is invalid

mod_fastdfs.conf
url_have_group_name = true

ERROR

fdht_set fail,errno: 2, error info: No such file or directory

错误码:2,错误信息:找不到节点或文件

trackerClient.getStoreStorage("group1")
报以下错误,fastDFS使用的是v5.09

com.github.tobato.fastdfs.exception.FdfsServerException: 错误码:2,错误信息:找不到节点或文件
at com.github.tobato.fastdfs.exception.FdfsServerException.byCode(FdfsServerException.java:54)
at com.github.tobato.fastdfs.proto.ProtoHead.validateResponseHead(ProtoHead.java:119)
at com.github.tobato.fastdfs.proto.AbstractFdfsCommand.receive(AbstractFdfsCommand.java:102)
at com.github.tobato.fastdfs.proto.AbstractFdfsCommand.execute(AbstractFdfsCommand.java:45)
at com.github.tobato.fastdfs.conn.ConnectionManager.execute(ConnectionManager.java:76)
at com.github.tobato.fastdfs.conn.TrackerConnectionManager.executeFdfsTrackerCmd(TrackerConnectionManager.java:76)
at com.github.tobato.fastdfs.service.DefaultTrackerClient.getStoreStorage(DefaultTrackerClient.java:54)
at com.linecorp.games.support.core.config.FastClientTest.test_uploadFile(FastClientTest.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

对 FastDFS 4.06 版本,TrackerClient 中的 listStorages 方法报错。

Caused by: java.io.IOException: fixFieldsTotalSize=612but byte array length: 600 is invalid!
at com.github.tobato.fastdfs.proto.tracker.internal.TrackerListStoragesResponse.decode(TrackerListStoragesResponse.java:50) ~[fastdfs-client-1.25.4-RELEASE.jar:1.25.4-RELEASE]
at com.github.tobato.fastdfs.proto.tracker.internal.TrackerListStoragesResponse.decodeContent(TrackerListStoragesResponse.java:33) ~[fastdfs-client-1.25.4-RELEASE.jar:1.25.4-RELEASE]
at com.github.tobato.fastdfs.proto.tracker.internal.TrackerListStoragesResponse.decodeContent(TrackerListStoragesResponse.java:20) ~[fastdfs-client-1.25.4-RELEASE.jar:1.25.4-RELEASE]
at com.github.tobato.fastdfs.proto.FdfsResponse.decode(FdfsResponse.java:54) ~[fastdfs-client-1.25.4-RELEASE.jar:1.25.4-RELEASE]
at com.github.tobato.fastdfs.proto.AbstractFdfsCommand.receive(AbstractFdfsCommand.java:105) ~[fastdfs-client-1.25.4-RELEASE.jar:1.25.4-RELEASE]
at com.github.tobato.fastdfs.proto.AbstractFdfsCommand.execute(AbstractFdfsCommand.java:45) ~[fastdfs-client-1.25.4-RELEASE.jar:1.25.4-RELEASE]
... 61 common frames omitted

连续 上传10万张图片

7:02:23.481 [main] ERROR c.g.t.f.proto.AbstractFdfsCommand - receive conent error
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.net.SocketInputStream.read(SocketInputStream.java:127)
at com.github.tobato.fastdfs.proto.ProtoHead.createFromInputStream(ProtoHead.java:94)
at com.github.tobato.fastdfs.proto.AbstractFdfsCommand.receive(AbstractFdfsCommand.java:99)
at com.github.tobato.fastdfs.proto.AbstractFdfsCommand.execute(AbstractFdfsCommand.java:45)
at com.github.tobato.fastdfs.conn.ConnectionManager.execute(ConnectionManager.java:76)
at com.github.tobato.fastdfs.conn.ConnectionManager.executeFdfsCmd(ConnectionManager.java:61)
at com.github.tobato.fastdfs.service.DefaultFastFileStorageClient.uploadFileAndMateData(DefaultFastFileStorageClient.java:131)
at com.github.tobato.fastdfs.service.DefaultFastFileStorageClient.uploadFile(DefaultFastFileStorageClient.java:54)
at tz.lion.ImageImportTest.run(ImageImportTest.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
17:02:23.599 [Thread-5] INFO o.s.w.c.s.GenericWebApplicationContext - Closing org.springframework.web.context.support.GenericWebApplicationContext@57cf54e1: startup date [Tue Aug 22 16:56:00 CST 2017]; root of context hierarchy
17:02:23.612 [Thread-5] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'primaryPersistenceUnit'

依赖启动报错

org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [FdfsConnectionPool [maxTotal=50, blockWhenExhausted=true, maxWaitMillis=100, lifo=true, fairness=false, testOnCreate=false, testOnBorrow=false, testOnReturn=false, testWhileIdle=true, timeBetweenEvictionRunsMillis=60000, numTestsPerEvictionRun=-1, minEvictableIdleTimeMillis=180000, softMinEvictableIdleTimeMillis=-1, evictionPolicy=org.apache.commons.pool2.impl.DefaultEvictionPolicy@475fb7, closeLock=java.lang.Object@41db6e4b, closed=false, evictionLock=java.lang.Object@5367d46f, evictor=org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@6c4eccd2, evictionIterator=null, factoryClassLoader=java.lang.ref.WeakReference@564e9c0b, oname=com.github.tobato.fastdfs.conn:type=FdfsConnectionPoolfdfsPool, creationStackTrace=java.lang.Exception
at org.apache.commons.pool2.impl.BaseGenericObjectPool.(BaseGenericObjectPool.java:143)
at org.apache.commons.pool2.impl.GenericKeyedObjectPool.(GenericKeyedObjectPool.java:105)
at com.github.tobato.fastdfs.conn.FdfsConnectionPool.(FdfsConnectionPool.java:33)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:170)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:117)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:271)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1270)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1127)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:584)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:373)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1344)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:513)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:484)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:618)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:177)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:318)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1344)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:506)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:484)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:618)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:177)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:318)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1344)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:388)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1246)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1234)
at org.daijie.api.ShiroApiStartUp.main(ShiroApiStartUp.java:29)
, borrowedCount=0, returnedCount=0, createdCount=0, destroyedCount=0, destroyedByEvictorCount=0, destroyedByBorrowValidationCount=0, activeTimes=StatsStore [values=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], size=100, index=0], idleTimes=StatsStore [values=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], size=100, index=0], waitTimes=StatsStore [values=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], size=100, index=0], maxBorrowWaitTimeMillis=0, swallowedExceptionListener=null, maxIdlePerKey=8, minIdlePerKey=0, maxTotalPerKey=8, factory=PooledConnectionFactory [], fairness=false, poolMap={}, poolKeyList=[], keyLock=java.util.concurrent.locks.ReentrantReadWriteLock@4c7d19bf[Write locks = 0, Read locks = 0], numTotal=0, evictionKeyIterator=null, evictionKey=null]] with key 'fdfsConnectionPool'; nested exception is javax.management.InstanceAlreadyExistsException: MXBean already registered with name com.github.tobato.fastdfs.conn:type=FdfsConnectionPoolfdfsPool
at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:626)
at org.springframework.jmx.export.MBeanExporter.lambda$registerBeans$2(MBeanExporter.java:552)
at java.util.HashMap.forEach(HashMap.java:1280)
at org.springframework.jmx.export.MBeanExporter.registerBeans(MBeanExporter.java:552)
at org.springframework.jmx.export.MBeanExporter.afterSingletonsInstantiated(MBeanExporter.java:435)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:777)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:388)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1246)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1234)
at org.daijie.api.ShiroApiStartUp.main(ShiroApiStartUp.java:29)
Caused by: javax.management.InstanceAlreadyExistsException: MXBean already registered with name com.github.tobato.fastdfs.conn:type=FdfsConnectionPoolfdfsPool
at com.sun.jmx.mbeanserver.MXBeanLookup.addReference(MXBeanLookup.java:151)
at com.sun.jmx.mbeanserver.MXBeanSupport.register(MXBeanSupport.java:160)
at com.sun.jmx.mbeanserver.MBeanSupport.preRegister2(MBeanSupport.java:173)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:930)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:900)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:324)
at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
at org.springframework.jmx.support.MBeanRegistrationSupport.doRegister(MBeanRegistrationSupport.java:137)
at org.springframework.jmx.export.MBeanExporter.registerBeanInstance(MBeanExporter.java:672)
at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:616)
... 14 more

fastdfs jar 中的@recuerce注入没有成功???

java.lang.NullPointerException: null
at com.github.tobato.fastdfs.service.DefaultTrackerClient.listGroups(DefaultTrackerClient.java:81) ~[na:na]
at io.ymq.dubbo.provider.service.DemoServiceImpl.sayHello(DemoServiceImpl.java:40) ~[na:na]
at com.alibaba.dubbo.common.bytecode.Wrapper1.invokeMethod(Wrapper1.java) ~[na:na]
at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:47) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:76) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:52) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:62) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:78) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:72) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:131) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:72) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:103) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:96) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:172) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:51) ~[dubbo-2.6.3.jar:2.6.3]
at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:80) ~[dubbo-2.6.3.jar:2.6.3]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_111]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_111]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111]

项目中的字符集问题

亲,能将你代码中的错误提示全部翻译为英文吗?因使用的时候需要查看源码说明,中文基本乱码。感谢 @ @tobato

配置化连接池参数

现在连接池配置是在 ConnectionPoolConfig 中作为常量定义,建议提取到 application.ymlfdfs.pool 中以支持连接池参数配置。

错误码:22,错误信息:无效的参数

作者,你好!我在使用下载功能时,提示如下错误:
com.github.tobato.fastdfs.exception.FdfsServerException: 错误码:22,错误信息:无效的参数
at com.github.tobato.fastdfs.exception.FdfsServerException.byCode(FdfsServerException.java:54)
at com.github.tobato.fastdfs.proto.ProtoHead.validateResponseHead(ProtoHead.java:119)
at com.github.tobato.fastdfs.proto.AbstractFdfsCommand.receive(AbstractFdfsCommand.java:102)
at com.github.tobato.fastdfs.proto.AbstractFdfsCommand.execute(AbstractFdfsCommand.java:45)
at com.github.tobato.fastdfs.conn.ConnectionManager.execute(ConnectionManager.java:76)
at com.github.tobato.fastdfs.conn.ConnectionManager.executeFdfsCmd(ConnectionManager.java:61)
at com.github.tobato.fastdfs.service.DefaultGenerateStorageClient.downloadFile(DefaultGenerateStorageClient.java:141)
at com.github.tobato.fastdfs.service.DefaultGenerateStorageClient.downloadFile(DefaultGenerateStorageClient.java:130)

上传没有问题。
@Autowired
AppendFileStorageClient storageClient;

@OverRide
public byte[] download(String group, String path) {
DownloadByteArray callback = new DownloadByteArray();
byte[] bytes=storageClient.downloadFile(group,path,callback);
return bytes;
}

文件断点续传问题

接口里面续传的uploadAppenderFile,appendFile方法中的参数fileSize,是整个需要上传的文件大小吗?测试的用例使用的两个字符串来测试的

生产验证

想了解下您的这个版本经过生产的验证吗?

DefaultGenerateStorageClient中按照fileOffset和fileSize分段下载文件时,传入的值无效,方法中参数值被写死

/**
 * 下载整个文件
 */
@Override
public <T> T downloadFile(String groupName, String path, DownloadCallback<T> callback) {
    long fileOffset = 0;
    long fileSize = 0;
    return downloadFile(groupName, path, fileOffset, fileSize, callback);
}

/**
 * 下载文件片段
 */
@Override
public <T> T downloadFile(String groupName, String path, long fileOffset, long fileSize,
        DownloadCallback<T> callback) {
    StorageNodeInfo client = trackerClient.getFetchStorage(groupName, path);
    StorageDownloadCommand<T> command = new StorageDownloadCommand<T>(groupName, path, 0, 0, callback);
    return connectionManager.executeFdfsCmd(client.getInetSocketAddress(), command);
}

receive conent error

java.io.IOException: recv cmd: 32 is not correct, expect cmd: 100
at com.github.tobato.fastdfs.proto.ProtoHead.validateResponseHead(ProtoHead.java:114)
at com.github.tobato.fastdfs.proto.AbstractFdfsCommand.receive(AbstractFdfsCommand.java:102)
at com.github.tobato.fastdfs.proto.AbstractFdfsCommand.execute(AbstractFdfsCommand.java:45)
at com.github.tobato.fastdfs.conn.ConnectionManager.execute(ConnectionManager.java:76)
at com.github.tobato.fastdfs.conn.TrackerConnectionManager.executeFdfsTrackerCmd(TrackerConnectionManager.java:76)
at com.github.tobato.fastdfs.service.DefaultTrackerClient.getStoreStorage(DefaultTrackerClient.java:39)

spring boot中使用FdfsConnectionPool报错

在spring boot 1.4中,内嵌tomcat,项目启动时报错,错误信息如下:WARN o.a.c.loader.WebappClassLoaderBase -The web application [api#v1] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:43)
2016-11-04 11:26:59.373 [main] INFO o.s.b.a.l.AutoConfigurationReportLoggingInitializer -

Error starting ApplicationContext. To display the auto-configuration report enable debug logging (start with --debug)

2016-11-04 11:26:59.389 [main] ERROR o.s.boot.SpringApplication -Application startup failed
org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [com.github.tobato.fastdfs.conn.FdfsConnectionPool@574413bd] with key 'tobaotoFdfsConnectionPool'; nested exception is javax.management.InstanceAlreadyExistsException: MXBean already registered with name org.apache.commons.pool2:type=GenericKeyedObjectPool,name=pool

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.