public DefaultFileQueueImpl(final String configFile, final String storageName) { this.meta = new DefaultFileQueueMeta(storageName, configFile); this.dataFile = new DefaultFileQueueDataFile(storageName, configFile); this.memcacheQueue = new LinkedBlockingQueue<MemCachedMessage<T>>( DefaultFileQueueConfig.getInstance(configFile).getMemCacheSize()); loadMeta(); this.storageName = storageName; this.configFile = configFile; this.lastMsg = new AtomicReference<MemCachedMessage<T>>(null); this.dataFileOutputStream = null; // 启动后台批量填充内存缓存的任务 start(); log.info( "Inited SeqFileStorage: " + storageName + " readingFile: " + memCacheFileReading + " pos: " + memCacheLoadPos); }
private void checkDataFileOutputStream() { FileInputStream input = null; try { // 启动的时候,dataFileOutputStream为null,不管上次启动时候写入的文件满了没, // 为了简单起见,还是新建一个文件 if (dataFileOutputStream == null) { String newDataFileName = dataFile.createStorageFile(); dataFileOutputStream = new ObjectOutputStream(new FileOutputStream(newDataFileName)); meta.updateWrite(newDataFileName); // 更新写入的偏移量 fileMap.put(newDataFileName, new AtomicLong(0)); objectOutputstreamTimes = 0; } input = new FileInputStream(meta.getFileWriting()); // 如果达到配置文件指定的大小,切换文件 if (input.available() >= DefaultFileQueueConfig.getInstance(configFile).getMaxDataFileSize()) { dataFileOutputStream.close(); String newDataFileName = dataFile.createStorageFile(); dataFileOutputStream = new ObjectOutputStream(new FileOutputStream(newDataFileName)); // 清除切换前老文件的记录 fileMap.remove(meta.getFileWriting()); meta.updateWrite(newDataFileName); // 更新写入的偏移量 fileMap.put(newDataFileName, new AtomicLong(0)); objectOutputstreamTimes = 0; } } catch (Exception e) { log.error("Create data file failed.", e); throw new RuntimeException("create data file failed.", e); } finally { if (input != null) { try { input.close(); } catch (IOException e) { log.error("Close temp inputstream for size cal failed.", e); } } } }