Giter Site home page Giter Site logo

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

断点续传的问题

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

错误码: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;
}

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

生产验证

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

项目中的字符集问题

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

重启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)

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.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,不知道和这个有没有关系,请问这是哪方面问题

连续 上传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'

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);
}

非spring-boot项目怎么使用

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

感谢!

上传从文件报错

上传从文件的时候报错:
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

依赖启动报错

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

mavne地址错误

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

ERROR

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

配置多个tracker有问题

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

报错: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

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]

配置化连接池参数

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

无法获取服务端连接资源:找不到可用的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)

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

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)

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

文件断点续传问题

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

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.

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

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

错误码: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)

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

多线程上传图片是 返回图片地址混乱 时不时发生
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

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没有文件下载,一般下载文件不是要经过服务后台吗,还是说借助浏览器的下载功能?

对 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

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.