tobato / fastdfs_client Goto Github PK
View Code? Open in Web Editor NEWJava Client for FastDFS
License: GNU Lesser General Public License v3.0
Java Client for FastDFS
License: GNU Lesser General Public License v3.0
该jar包能否在生产环境下使用?
spring mvc 怎么用!!! 谢谢!!
执行上传文件成功,但是执行删除接口之后,文件并未删除。
想了解下您的这个版本经过生产的验证吗?
你好 我使用你的代码配置进行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问题呢
用的https://github.com/phinexdaz/fdfs_tracker docker镜像生成的容器,在上传的时候报错com.github.tobato.fastdfs.exception.FdfsConnectException: 无法获取服务端连接资源:can't create connection to/172.17.0.3:23000 一台tracker服务器,2台storage服务器,都是单独部署。排查很久不知道问题出在哪,望解答,谢谢!
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'
MXBean already registered with name com.github.tobato.fastdfs.conn:type=FdfsConnectionPoolfdfsPool
在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
接口里面续传的uploadAppenderFile,appendFile方法中的参数fileSize,是整个需要上传的文件大小吗?测试的用例使用的两个字符串来测试的
因为要将来有可能会需要对一些已经存放在dfs,但是没有缩略图的数据补充缩略图
作者在文档中是1.26.2-RELEASE,我去**仓库查了一下1.26.x只有1.26.2和1.26.1-RELEASE两个版本,希望修改一下文档信息,希望作者项目越来越好。
看了以前针对这个问题的答案,发现只有对StorageClient加锁才有用,但是加锁的话图片加载太慢。
无论是@scope('prototype')还是配置fdfs.pool都没有用。
求解答
这样就总是尝试加载对应的服务器 无法正常使用
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
或者是否可以模糊查询也行
亲,能将你代码中的错误提示全部翻译为英文吗?因使用的时候需要查看源码说明,中文基本乱码。感谢 @ @tobato
代码中在断点续传的时候,并没有从客户端获取上次上传文件的位置,怎么做到的断点续传?
com.github.tobato.fastdfs.exception.FdfsIOException: 客户端连接服务端出现了io异常:socket io exception occured while receive content
/**
跟踪此处跳出异常:java.net.SocketException: Software caused connection abort: socket write error
作者,你好!我在使用下载功能时,提示如下错误:
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;
}
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.
前缀不能有大写字母 要用 ‘-’ 隔开
在网上看到的办法,试了也无效
这种异常一般发生在 多线程同时使用一个StorageClient操作文件的情况下。
有两种解决办法:
1、对StorageClient对象加锁
2、每次下载或上传文件时,重新new一个StorageClient
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)
现在连接池配置是在 ConnectionPoolConfig
中作为常量定义,建议提取到 application.yml
的 fdfs.pool
中以支持连接池参数配置。
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]
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)
配置多个tracker,然后关掉其中一个tracker服务,文件上传时会报错,提示连接不到关掉的那个tracker服务。
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
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,不知道和这个有没有关系,请问这是哪方面问题
@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没有文件下载,一般下载文件不是要经过服务后台吗,还是说借助浏览器的下载功能?
/**
* 下载整个文件
*/
@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);
}
上传从文件的时候报错:
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
fdht_set fail,errno: 2, error info: No such file or directory
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
在使用过程中,发现有一个异常,具体错误信息如下,好像这是一个潜在的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
1.我是非spring-boot项目怎么使用你的client;
2.上传、下载接口是否可以再丰富些,比如上传api官网的client是不需要传groupName,client自动获取
感谢!
group无法配置导致现在的fdfs的group必须包含“group”字段
我的配置,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)
大佬帮看下可能是哪里出问题了
多线程上传图片是 返回图片地址混乱 时不时发生
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吗?这里面有偏移量的说法吗?
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)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.