项目部署了一台tracker节点,两台storage节点,下载jar包时,总是时不时的下载不下来,报空指针,代码如下

//moduleVersion.getFileUrl()的结果group1/M00/00/00/CgpNpl0Z6tCAQkvZA53GMmLvqiA741.jar
String groupName = moduleVersion.getFileUrl().substring(0, .indexOf("/"));String routeFileName =moduleVersion.getFileUrl().substring(moduleVersion.getFileUrl().indexOf("/") + 1);byte[] fileByte = FastDFSClientUtil.downFile(groupName, routeFileName);

FastDFSClientUtil工具类的代码如下:

package com.supconit.data.algorithm.platform.util;import com.supconit.data.algorithm.platform.common.entity.FastDfs.FastDFSFile;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;/*** Created by dell on 2019/4/25.*/
public class FastDFSClientUtil {@Autowiredprivate static String STORAGE_SERVER_GROUP = "group1";@Autowiredprivate static String STORAGE_SERVER_PORT = "23000";private static TrackerClient trackerClient;private static TrackerServer trackerServer;private static StorageClient storageClient;private static StorageServer storageServer;private static org.slf4j.Logger logger = LoggerFactory.getLogger(FastDFSClientUtil.class);static {try {ClassPathResource classPathResource = new ClassPathResource("fdfs_client.conf");//创建临时文件,将fdfs_client.conf的值赋值到临时文件中,创建这个临时文件的原因是springboot打成jar后无法获取classpath下文件String tempPath =System.getProperty("java.io.tmpdir") + System.currentTimeMillis()+".conf";File f = new File(tempPath);IOUtils.copy(classPathResource.getInputStream(),new FileOutputStream(f));ClientGlobal.init(f.getAbsolutePath());trackerClient = new TrackerClient();trackerServer = trackerClient.getConnection();//给dfs发送一个消息,不然会报recv package size -1!=10错误ProtoCommon.activeTest(trackerServer.getSocket());} catch (Exception e) {logger.error("FastDFS Client Init Fail!",e);}}
/*** 上传文件* storepath 0代表input,1代表算法,2代表output*/public static String[] upload(FastDFSFile file,String storepath) {logger.info("File Name: " + file.getName() + "File Length:" + file.getContent().length);NameValuePair[] meta_list = new NameValuePair[1];meta_list[0] = new NameValuePair("author", file.getAuthor());long startTime = System.currentTimeMillis();String[] uploadResults = null;try {String storageIp = getStorageServerIp(trackerClient,trackerServer);if (StringUtils.isBlank(storageIp)){logger.error("stroageIp is null, error code:" + storageClient.getErrorCode());}storageServer =getStorageServer(storageIp,storepath);storageClient = new StorageClient(trackerServer, storageServer);uploadResults = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);} catch (IOException e) {logger.error("IO Exception when uploadind the file:" + file.getName(), e);} catch (Exception e) {logger.error("Non IO Exception when uploadind the file:" + file.getName(), e);}logger.info("upload_file time used:" + (System.currentTimeMillis() - startTime) + " ms");if (uploadResults == null) {logger.error("upload file fail, error code:" + storageClient.getErrorCode());}String groupName = uploadResults[0];String remoteFileName = uploadResults[1];logger.info("upload file successfully!!!" + "group_name:" + groupName + ", remoteFileName:" + " " + remoteFileName);return uploadResults;}/*** 下载* @param groupName* @param remoteFileName* @return*/public static byte[] downFile(String groupName, String remoteFileName) {try {storageServer = trackerClient.getStoreStorage(trackerServer);storageClient = new StorageClient(trackerServer, storageServer);byte[] fileByte = storageClient.download_file(groupName, remoteFileName);return fileByte;} catch (IOException e) {logger.error("IO Exception: Get File from Fast DFS failed", e);} catch (Exception e) {logger.error("Non IO Exception: Get File from Fast DFS failed", e);}return null;}/*** 删除文件* @param groupName* @param remoteFileName* @throws Exception*/public static void deleteFile(String groupName, String remoteFileName)throws Exception {storageClient = new StorageClient(trackerServer, storageServer);int i = storageClient.delete_file(groupName, remoteFileName);logger.info("delete file successfully!!!" + i);}/*** 获得可用的storage IP** @param trackerClient* @param trackerServer* @return 返回storage IP*/private static String getStorageServerIp(TrackerClient trackerClient, TrackerServer trackerServer) {String storageIp = null;if (trackerClient != null && trackerServer != null) {try {StorageServer storageServer = trackerClient.getStoreStorage(trackerServer, STORAGE_SERVER_GROUP);storageIp = storageServer.getSocket().getInetAddress().getHostAddress();} catch (IOException e) {e.printStackTrace();}}return storageIp;}/*** 得到Storage服务** @param storageIp* @param storepath 0代表input服务的jar包,1代表算法服务的jar包,2代表output服务的jar包* @return 返回Storage服务*/private static StorageServer getStorageServer(String storageIp,String storepath) {StorageServer storageServer = null;if (storageIp != null && !("").equals(storageIp) &&null != storepath && !("").equals(storepath)) {try {storageServer = new StorageServer(storageIp, Integer.parseInt(STORAGE_SERVER_PORT), Integer.parseInt(storepath));} catch (IOException e) {e.printStackTrace();}}return storageServer;}
}

报错如下:

我怀疑是下载的时候,两台storage存储节点之间没有同步完成,例如tracker分配storageA存的jar包,下载的时候从storageB去下载,这个时候storageA还没有把jar包同步到storageB,所以会报空指针,然后修改的tracker的conf文件,将download_server=0 修改为1,修改完后重启tracker服务器

download_server=1
#选择哪个storeServer最为下载服务器,0.轮询,1.哪个为源则哪个下载

再次测试,发现问题还是没有解决,然后开始了无限的打印之路,慢慢调试。。。
然后将代码修改成如果的第一次从fastdfs上下载失败的话,就再下载一次,没有报错了,实在是不知道原因。。。。

  String groupName =moduleVersion.getFileUrl().substring(0, moduleVersion.getFileUrl().indexOf("/"));String routeFileName =moduleVersion.getFileUrl().substring(moduleVersion.getFileUrl().indexOf("/") + 1);byte[] fileByte = FastDFSClientUtil.downFile(groupName, routeFileName);//有的时候会从fastdfs下载失败,如果下载失败的话,那么就在从fastdfs上下载一次if (null == fileByte){fileByte = FastDFSClientUtil.downFile(groupName, routeFileName);}

fastdfs下载报空指针相关推荐

  1. 切记切记:Spring配置文件中,Component-scan无法扫描到的类中的自动装配对象无法被调用,报空指针错误。...

    Spring单例注入,单例对象可设置成Spring元件. 只有Spring的元件中@Autowired才有用,在普通类中@Autowired虽然不会编译报错,但运行时会报空指针错误. 转载于:http ...

  2. 最小化安装linux CentOS-6.6后 部署fastdfs +下载地址 很干很干的干货

    参考:http://blog.itpub.net/7734666/viewspace-1292485/ 安装一些必要软件 yum -y install wget gcc perl mkdir ~/zy ...

  3. vue-axios下载文件流blob,ie下载报传递给系统调用的数据区域太小.ie文件流下载报错;文件下载失败将blob的错误信息转换成json格式

    本次下载是后台文件流传输,前端下载,前端将拿到的下载id和名称downloadName传递给下载方法:如果是多个下载,可以采用数组for循环 情景描述: 1.如果符合导出条件, 后端直接返回数据流,如 ...

  4. @Inject 注入 还是报空指针

    @Inject 注入 还是报空指针 发布于 572天前  作者 子寒磊  1435 次浏览  复制  上一个帖子  下一个帖子  标签: 无 @IocBean @Service("userM ...

  5. jdbc mysql 存储过程执行失败_JDBC连接执行MySQL存储过程报空指针或权限错误

    JDBC连接执行MySQL存储过程报空指针或权限错误 最近使用root用户编写了几个存储过程,但是使用普通用户通过JDBC连接执行却报错: java.lang.NullPointerException ...

  6. [Keil 烧录器下载报错] “Flash Timeout. Reset the Target and try it again”

    1.首先检查是否为BOOT0,BOOT1选择导致的下载方式错误. 2.最有可能的原因是STM32芯片读写保护,导致程序烧录失败. 第二种解决办法如下: 使用ST-Link Utility去除STM32 ...

  7. pip下载报错:pip._vendor.urllib3.exceptions.SSLError: [SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC] decry

    pip下载报错: pip下载命令如下: sudo pip3 install keras-bert -i https://pypi.tuna.tsinghua.edu.cn/simple/ 报错内容: ...

  8. 鸿蒙当中使用WebView报空指针的问题

    鸿蒙当中使用WebView报空指针的问题 文章目录 鸿蒙当中使用WebView报空指针的问题 前言 一.原因是什么? 二.使用步骤 1.直接写上的情况 2.需要做的修改 总结 前言 鸿蒙当中使用Web ...

  9. AVR单片机用progisp下载报错flash verify error at :0h

    Atmega16用progisp下载报错flash verify error at :0h 一番辛苦查找原因,终于找到一个解决方案,可以参考一下. 首先,确保ATmega16单片机没有一直被复位,并且 ...

最新文章

  1. jquery combobox
  2. 解决xcode打开时假死的问题
  3. DCMTK:修改DICOM文件的类
  4. aws lambda_跑来跑去:假人与AWS Lambda的第一次接触
  5. Oracle 常用伎俩和剧本
  6. JSON为什么那样红(另有洞天)
  7. jq 下拉加载每次只执行一次_记一次 无限列表 滚动优化
  8. mysql pdo手册_灾难恢复 - [ MySql参考手册 ] - 在线原生手册 - php中文网
  9. STM32单片机实现DMA+ADC+UART功能
  10. 页面的title为乱码的话需要修改jsp页面pageEncoding=UTF-8
  11. iOS开发--字典(NSDictionary)和JSON字符串(NSString)之间互转
  12. 各位有没有遇到过这样的问题?
  13. C-V2X国内现状分析
  14. 如何下载B站(哔哩哔哩)高清视频?
  15. 4.1日预测及操作建议
  16. 关于浏览器自动转https
  17. 农场渲染文件服务器搭建,在渲染农场部署Maya to Arnold
  18. 传说中的Linux三剑客命令之grep(三剑客老幺)别人只知道了而我却做到了
  19. 独立的荣耀将首次与华为打擂台,谁的折叠手机更有优势?
  20. RelativeLayout控件之填满

热门文章

  1. 使用CNN,RNN和HAN 进行文本分类
  2. 鲁大师查验Acer电脑信息
  3. 阿里巴巴-游戏开发面经
  4. 为什么薄膜干涉的厚度要很小_大学物理第五章思考题与习题答案
  5. 还没学会微服务?这份最全微服务总结送给你
  6. Unity之几何着色器--草随风摇曳
  7. mac系统下怎么使用git
  8. 跨 AZ 部署最佳实践之 Zookeeper
  9. 自定义Dialog弹窗提示
  10. 简述WebVR的发展现状和三种实现形态