日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java負(fù)載均衡服務(wù)器實(shí)現(xiàn)上傳文件同步

瀏覽:18日期:2022-08-24 11:33:51

負(fù)載服務(wù)器Z,應(yīng)用服務(wù)器A 和B ,從A上傳的附件,如何在B上下載下來(lái)?

這個(gè)問(wèn)題我的解決思路如下(后來(lái)被一個(gè)裝逼的面試官給批評(píng)了這種做法,不過(guò)我瞧不起他)

服務(wù)器A、B 上傳附件的時(shí)候,將這個(gè)附件備份到服務(wù)器Z ,當(dāng)A、B下載文件的時(shí)候,首先會(huì)在自己服務(wù)器的目錄下尋找,如果找不到,就會(huì)從服務(wù)器Z 上下載一份到當(dāng)前服務(wù)器。

服務(wù)器之間的文件備份通過(guò)sftp,參考:https://www.jb51.net/article/196008.htm(下文中的SftpCustom 類就是這個(gè)鏈接里的 “SFTP上傳下載文件例子” 中的類)

這里主要介紹一下重寫(xiě)上傳、下載的方法時(shí)應(yīng)該添加的代碼

上傳文件,異步操作

new Thread(() -> {SftpCustom fu = new SftpCustom();fu.upload(file.getAbsolutePath(), getFileName(fileDescr));fu.closeChannel();}).start();

下載文件,先從當(dāng)前服務(wù)器尋找

String tmpPath = roots[0].getPath() + ’/’ + getFileName(fileDescr);File file2 = new File(tmpPath);if (file2.exists()) {return FileUtils.openInputStream(file2);}SftpCustom fu = new SftpCustom();fu.download(getFileName(fileDescr), tmpPath);file2 = new File(tmpPath);inputStream = FileUtils.openInputStream(file2);fu.closeChannel();return inputStream;

cuba 框架中重寫(xiě)上傳文件類FileStorage.java 的代碼如下:

package com.haulmont.cuba.core.app.custom;import com.google.common.util.concurrent.ThreadFactoryBuilder;import com.haulmont.cuba.core.app.FileStorageAPI;import com.haulmont.cuba.core.app.ServerConfig;import com.haulmont.cuba.core.entity.FileDescriptor;import com.haulmont.cuba.core.global.*;import com.haulmont.cuba.core.sys.AppContext;import com.haulmont.cuba.core.sys.SecurityContext;import org.apache.commons.io.FileUtils;import org.apache.commons.io.IOUtils;import org.apache.commons.lang.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;import javax.inject.Inject;import java.io.*;import java.nio.charset.StandardCharsets;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Calendar;import java.util.List;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import static com.haulmont.bali.util.Preconditions.checkNotNullArgument;public class FileStorage implements FileStorageAPI { private final Logger log = LoggerFactory.getLogger(FileStorage.class); @Inject protected UserSessionSource userSessionSource; @Inject protected TimeSource timeSource; @Inject protected Configuration configuration; protected boolean isImmutableFileStorage; protected ExecutorService writeExecutor = Executors.newFixedThreadPool(5, new ThreadFactoryBuilder().setNameFormat('FileStorageWriter-%d').build()); protected volatile File[] storageRoots; @PostConstruct public void init() { this.isImmutableFileStorage = configuration.getConfig(ServerConfig.class).getImmutableFileStorage(); } /** * INTERNAL. Don’t use in application code. */ public File[] getStorageRoots() { if (storageRoots == null) { String conf = configuration.getConfig(ServerConfig.class).getFileStorageDir(); if (StringUtils.isBlank(conf)) {String dataDir = configuration.getConfig(GlobalConfig.class).getDataDir();File dir = new File(dataDir, 'filestorage');dir.mkdirs();storageRoots = new File[]{dir}; } else {List<File> list = new ArrayList<>();for (String str : conf.split(',')) { str = str.trim(); if (!StringUtils.isEmpty(str)) { File file = new File(str); if (!list.contains(file)) list.add(file); }}storageRoots = list.toArray(new File[list.size()]); } } return storageRoots; } @Override public long saveStream(final FileDescriptor fileDescr, final InputStream inputStream) throws FileStorageException { checkFileDescriptor(fileDescr); File[] roots = getStorageRoots(); // Store to primary storage checkStorageDefined(roots, fileDescr); checkPrimaryStorageAccessible(roots, fileDescr); File dir = getStorageDir(roots[0], fileDescr); dir.mkdirs(); checkDirectoryExists(dir); final File file = new File(dir, getFileName(fileDescr)); checkFileExists(file); long size = 0; OutputStream os = null; try { os = FileUtils.openOutputStream(file); size = IOUtils.copyLarge(inputStream, os); os.flush(); writeLog(file, false); new Thread(() -> {SftpCustom fu = new SftpCustom();fu.upload(file.getAbsolutePath(), getFileName(fileDescr));fu.closeChannel(); }).start(); } catch (IOException e) { IOUtils.closeQuietly(os); FileUtils.deleteQuietly(file); throw new FileStorageException(FileStorageException.Type.IO_EXCEPTION, file.getAbsolutePath(), e); } finally { IOUtils.closeQuietly(os); } // Copy file to secondary storages asynchronously final SecurityContext securityContext = AppContext.getSecurityContext(); for (int i = 1; i < roots.length; i++) { if (!roots[i].exists()) {log.error('Error saving {} into {} : directory doesn’t exist', fileDescr, roots[i]);continue; } File copyDir = getStorageDir(roots[i], fileDescr); final File fileCopy = new File(copyDir, getFileName(fileDescr)); writeExecutor.submit(new Runnable() {@Overridepublic void run() { try { AppContext.setSecurityContext(securityContext); FileUtils.copyFile(file, fileCopy, true); writeLog(fileCopy, false); } catch (Exception e) { log.error('Error saving {} into {} : {}', fileDescr, fileCopy.getAbsolutePath(), e.getMessage()); } finally { AppContext.setSecurityContext(null); }} }); } return size; } protected void checkFileExists(File file) throws FileStorageException { if (file.exists() && isImmutableFileStorage) throw new FileStorageException(FileStorageException.Type.FILE_ALREADY_EXISTS, file.getAbsolutePath()); } protected void checkDirectoryExists(File dir) throws FileStorageException { if (!dir.exists()) throw new FileStorageException(FileStorageException.Type.STORAGE_INACCESSIBLE, dir.getAbsolutePath()); } protected void checkPrimaryStorageAccessible(File[] roots, FileDescriptor fileDescr) throws FileStorageException { if (!roots[0].exists()) { log.error('Inaccessible primary storage at {}', roots[0]); throw new FileStorageException(FileStorageException.Type.STORAGE_INACCESSIBLE, fileDescr.getId().toString()); } } protected void checkStorageDefined(File[] roots, FileDescriptor fileDescr) throws FileStorageException { if (roots.length == 0) { log.error('No storage directories defined'); throw new FileStorageException(FileStorageException.Type.STORAGE_INACCESSIBLE, fileDescr.getId().toString()); } } @Override public void saveFile(final FileDescriptor fileDescr, final byte[] data) throws FileStorageException { checkNotNullArgument(data, 'File content is null'); saveStream(fileDescr, new ByteArrayInputStream(data)); } protected synchronized void writeLog(File file, boolean remove) { SimpleDateFormat df = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss.SSS'); StringBuilder sb = new StringBuilder(); sb.append(df.format(timeSource.currentTimestamp())).append(' '); sb.append('[').append(userSessionSource.getUserSession().getUser()).append('] '); sb.append(remove ? 'REMOVE' : 'CREATE').append(' '); sb.append(''').append(file.getAbsolutePath()).append(''n'); File rootDir; try { rootDir = file.getParentFile().getParentFile().getParentFile().getParentFile(); } catch (NullPointerException e) { log.error('Unable to write log: invalid file storage structure', e); return; } File logFile = new File(rootDir, 'storage.log'); try { try (FileOutputStream fos = new FileOutputStream(logFile, true)) {IOUtils.write(sb.toString(), fos, StandardCharsets.UTF_8.name()); } } catch (IOException e) { log.error('Unable to write log', e); } } @Override public void removeFile(FileDescriptor fileDescr) throws FileStorageException { checkFileDescriptor(fileDescr); File[] roots = getStorageRoots(); if (roots.length == 0) { log.error('No storage directories defined'); return; } for (File root : roots) { File dir = getStorageDir(root, fileDescr); File file = new File(dir, getFileName(fileDescr)); if (file.exists()) {if (!file.delete()) { throw new FileStorageException(FileStorageException.Type.IO_EXCEPTION, 'Unable to delete file ' + file.getAbsolutePath());} else { writeLog(file, true);} } } } protected void checkFileDescriptor(FileDescriptor fd) { if (fd == null || fd.getCreateDate() == null) { throw new IllegalArgumentException('A FileDescriptor instance with populated ’createDate’ attribute must be provided'); } } @Override public InputStream openStream(FileDescriptor fileDescr) throws FileStorageException { checkFileDescriptor(fileDescr); File[] roots = getStorageRoots(); if (roots.length == 0) { log.error('No storage directories available'); throw new FileStorageException(FileStorageException.Type.FILE_NOT_FOUND, fileDescr.getId().toString()); } InputStream inputStream = null; for (File root : roots) { File dir = getStorageDir(root, fileDescr); File file = new File(dir, getFileName(fileDescr)); if (!file.exists()) {log.error('File ' + file + ' not found');continue; } try {inputStream = FileUtils.openInputStream(file);break; } catch (IOException e) {log.error('Error opening input stream for ' + file, e); } } if (inputStream != null) { return inputStream; } else { try {String tmpPath = roots[0].getPath() + ’/’ + getFileName(fileDescr);File file2 = new File(tmpPath);if (file2.exists()) { return FileUtils.openInputStream(file2);}SftpCustom fu = new SftpCustom();fu.download(getFileName(fileDescr), tmpPath);file2 = new File(tmpPath);inputStream = FileUtils.openInputStream(file2);fu.closeChannel();return inputStream; } catch (Exception e) {throw new FileStorageException(FileStorageException.Type.FILE_NOT_FOUND, fileDescr.getId().toString()); } } } @Override public byte[] loadFile(FileDescriptor fileDescr) throws FileStorageException { InputStream inputStream = openStream(fileDescr); try { return IOUtils.toByteArray(inputStream); } catch (IOException e) { throw new FileStorageException(FileStorageException.Type.IO_EXCEPTION, fileDescr.getId().toString(), e); } finally { IOUtils.closeQuietly(inputStream); } } @Override public boolean fileExists(FileDescriptor fileDescr) { checkFileDescriptor(fileDescr); File[] roots = getStorageRoots(); for (File root : roots) { File dir = getStorageDir(root, fileDescr); File file = new File(dir, getFileName(fileDescr)); if (file.exists()) {return true; } } return false; } /** * INTERNAL. Don’t use in application code. */ public File getStorageDir(File rootDir, FileDescriptor fileDescriptor) { checkNotNullArgument(rootDir); checkNotNullArgument(fileDescriptor); Calendar cal = Calendar.getInstance(); cal.setTime(fileDescriptor.getCreateDate()); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; int day = cal.get(Calendar.DAY_OF_MONTH); return new File(rootDir, year + '/'+ StringUtils.leftPad(String.valueOf(month), 2, ’0’) + '/'+ StringUtils.leftPad(String.valueOf(day), 2, ’0’)); } public static String getFileName(FileDescriptor fileDescriptor) { return fileDescriptor.getId().toString() + '.' + fileDescriptor.getExtension(); } @PreDestroy protected void stopWriteExecutor() { writeExecutor.shutdown(); }}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久久久免费av| 丝袜美腿一区二区三区| а√在线中文在线新版| 蜜桃视频一区二区三区在线观看| 国产日韩视频| 亚洲精品黄色| 久久午夜视频| 1024精品久久久久久久久| 中文字幕在线看片| 中文在线а√天堂| 国产女人18毛片水真多18精品| 久草免费在线视频| 欧美国产一级| 欧美激情另类| 色婷婷精品视频| 欧美国产偷国产精品三区| 日精品一区二区三区| 99久久99视频只有精品| 久久精品人人| 亚洲a一区二区三区| 视频一区国产视频| yellow在线观看网址| 国产一区精品福利| 91亚洲国产高清| 亚洲一二av| 亚洲深夜福利| 久久久国产精品入口麻豆| 国产日韩欧美一区二区三区 | 亚洲精品日本| 日韩国产在线观看| 男女性色大片免费观看一区二区 | 石原莉奈在线亚洲三区| 亚洲永久av| 日韩国产91| 久久女人天堂| 日本aⅴ免费视频一区二区三区| japanese国产精品| 一区二区自拍| 日韩和欧美一区二区三区| 国产精品一二| 精品久久免费| 精品三级av在线导航| 亚洲中午字幕| 日韩一区精品| 久久免费精品| 国产日韩欧美中文在线| 99久久久久国产精品| 婷婷综合国产| 国产精品4hu.www| 偷拍精品精品一区二区三区| 伊人久久国产| 日韩午夜一区| 国产精品美女久久久久久不卡| 久久中文字幕av| 国产精品15p| 石原莉奈在线亚洲三区| 久久理论电影| 啪啪国产精品| 日韩高清欧美| 国产欧美高清视频在线| 精品国模一区二区三区| 亚欧成人精品| 欧美日韩亚洲在线观看| 国产成人精品一区二区三区视频| 1024精品久久久久久久久| 蜜臀国产一区| 欧美a一区二区| 狠狠躁少妇一区二区三区| 久热精品在线| 亚洲青青久久| 亚洲最大av| 亚洲一级特黄| 蜜臀久久精品| 精品视频网站| 日韩va欧美va亚洲va久久| 亚洲欧美一区在线| 国产日韩欧美一区二区三区| 亚洲人成亚洲精品| 国产精品亚洲四区在线观看| 国产精品99精品一区二区三区∴| 91精品xxx在线观看| 日韩欧美另类中文字幕| 首页国产精品| 91精品福利观看| av成人国产| 色偷偷色偷偷色偷偷在线视频| 天海翼亚洲一区二区三区| 中文一区一区三区高中清不卡免费| 一区二区三区网站| 蜜臀av免费一区二区三区| 麻豆国产91在线播放| 亚洲精品欧美| 亚洲色诱最新| 久久久国产亚洲精品| 久久99精品久久久野外观看| 亚洲人成在线影院| 蜜桃视频一区二区| 免费人成网站在线观看欧美高清| 欧美不卡高清| 亚洲福利国产| 欧美成人国产| 午夜国产欧美理论在线播放 | 久热精品在线| 久久国产精品亚洲77777| 欧美a级一区| 日韩美女国产精品| 五月天综合网站| 日本 国产 欧美色综合| 美国三级日本三级久久99| 在线亚洲免费| 欧美 日韩 国产一区二区在线视频| 国产精品久久久久久久久久白浆 | 日韩高清电影一区| 亚洲综合不卡| 日韩在线网址| 美女视频网站久久| 电影亚洲精品噜噜在线观看| 精品国产午夜肉伦伦影院| 中文字幕免费精品| 伊人久久亚洲| 国产一区二区三区黄网站| 久久丁香四色| 97精品视频在线看| 欧美a级一区| 欧美91在线|欧美| 亚洲在线免费| 久久精品主播| 欧美91在线| 欧洲一级精品| 欧美1级日本1级| 999国产精品永久免费视频app| 夜夜嗨网站十八久久 | 国产精品对白久久久久粗| 高清av一区| 久久国产精品毛片| 另类专区亚洲| 国产精品主播| 日韩制服丝袜先锋影音| 国产高潮在线| 日韩精品视频中文字幕| 免费在线欧美黄色| 久久中文亚洲字幕| 欧美日本一区| 色爱av综合网| 日韩黄色av| 亚洲欧洲一区二区天堂久久| 日韩高清一级| 99精品综合| 中文字幕在线视频久| 日韩精品欧美| 蜜桃久久久久| 国产女优一区| 五月激情久久| 国产精品巨作av| 热久久国产精品| 欧美午夜精彩| 欧美好骚综合网| 你懂的国产精品| 欧美啪啪一区| 日韩视频1区| 亚洲激情偷拍| 国产精品亚洲一区二区三区在线观看| 久久国产欧美日韩精品| 欧美 日韩 国产一区二区在线视频 | 久久国产精品久久久久久电车| 麻豆精品国产91久久久久久| 日韩一区二区三区精品视频第3页| 精品一区免费| 蜜桃视频在线网站| 亚洲伦乱视频| 日韩欧美精品一区| 麻豆精品国产91久久久久久| 日韩福利视频导航| 日韩国产欧美三级| 欧美日韩一区二区国产| 日韩一区二区三区四区五区| 日本在线一区二区三区| 日本不卡视频在线| 91在线成人| 国产欧美日韩精品高清二区综合区| 欧美日韩一区二区高清| 国产精品s色| 久久精品欧洲| 荡女精品导航| 日韩精品欧美| 国产亚洲毛片| 久久国产日韩欧美精品| 桃色一区二区| 女主播福利一区| 亚洲综合五月| 国产精品自在| 岛国av在线播放| 91精品福利| 婷婷精品在线观看| 久久精品国产亚洲一区二区三区| 亚洲啊v在线| 色综合视频一区二区三区日韩 | 日韩国产欧美| 国产综合视频| 免费看日韩精品|