package com.vci.dbsync.filesync; import com.vci.corba.common.VCIError; import com.vci.corba.volumn.method.VolumnManagement; import com.vci.dbsync.entity.VMInfo; import com.vci.dbsync.log.SyncLog; public class FileSync { private VMInfo _srcVMInfo; private ORBHelper _srcORB = null; private VolumnManagement _vmSrc = null; private VMInfo _destVMInfo; private ORBHelper _destORB = null; private VolumnManagement _vmDest = null; private int _blocksize = 32; private int _count = 0; public FileSync(VMInfo src, VMInfo dest){ _srcVMInfo = src; _destVMInfo = dest; } public boolean Init(boolean forward) throws VCIError { try { if (forward) // 正向 { _srcORB = new ORBHelper(); _srcORB.InitORB(_srcVMInfo.getUrl(), _srcVMInfo.getIdentity()); _destORB = new ORBHelper(); _destORB.InitORB(_destVMInfo.getUrl(), _destVMInfo.getIdentity()); _vmSrc = _srcORB.getVolumnService(_srcVMInfo.getService()); _vmDest = _destORB.getVolumnService(_destVMInfo.getService()); } else // 反向 { _srcORB = new ORBHelper(); _srcORB.InitORB(_destVMInfo.getUrl(), _destVMInfo.getIdentity()); _destORB = new ORBHelper(); _destORB.InitORB(_srcVMInfo.getUrl(), _srcVMInfo.getIdentity()); _vmSrc = _srcORB.getVolumnService(_destVMInfo.getService()); _vmDest = _destORB.getVolumnService(_srcVMInfo.getService()); } } catch (Exception e) { e.printStackTrace(); if (e instanceof VCIError) { throw (VCIError)e; } throw(new VCIError(e.getLocalizedMessage(),new String[]{"Init File Sync Exception"})); //throw new VCIError("uploadFileToVolume", new String[0]); } return true; } public void close(){ if (_srcORB != null) _srcORB.close(); _srcORB = null; if (_destORB != null) _destORB.close(); _destORB = null; } /** * 上传文件到指定的卷 * @param volName * @param ownBizOBJType * @param ownBizOBJOid * @param localFilePath * @return * @throws VCIError */ public boolean syncFile(String volFile) { try { String srcFile = _srcORB.getFilePath(volFile); String destFile = _destORB.getFilePath(volFile); if (!_vmSrc.isFileExist(srcFile)) return false; long fileSize = _vmSrc.getFileSize(srcFile); if (fileSize == 0) return false; long curTime = _vmSrc.getCurrrentTimeMillions(); int blockSize = _blocksize * 1024; byte[] buffer = new byte[blockSize]; long offset = 0; while (offset < (fileSize - blockSize)) { buffer = _vmSrc.sendFile(srcFile, offset); _vmDest.receiveFile(destFile, buffer, offset, curTime, fileSize); offset += blockSize; } long remainSize = fileSize - offset; if (remainSize > 0) { buffer = new byte[(int)remainSize]; buffer = _vmSrc.sendFile(srcFile, offset); _vmDest.receiveFile(destFile, buffer, offset, curTime, fileSize); } _count++; return true; } catch (Exception e) { e.printStackTrace(); SyncLog.logger.error("同步文件异常:" + volFile); SyncLog.logger.error(e); return false; // if (e instanceof VCIError) { // throw (VCIError)e; // } // throw(new VCIError(e.getMessage(), new String[]{"Sync File Exception", volFile})); //throw new VCIError("uploadFileToVolume", new String[0]); } } public int getCount() { return _count; } }