diff --git a/CHANGELOG.md b/CHANGELOG.md index 30d83d1..a9c46e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,13 +30,15 @@ * [V 1.0.0]() ------ -## [V 1.0.6] - 2023.4.28 +## [V 1.0.6] - 2023.5.6 ### FileModule - 🚧施工: 所有的`OSS`方法类,正在施工,不建议使用 - +- 🐞Bug: **#00004** `FileCache sync方法` 出现ConcurrentModifiedException +- ⛏修复: 修复 **#00004**, 文件缓存的map地址虽然改变,但是Object没改变,导致更改文件为公共的,产生并发错误,更改push的Map是全新的不会有公用数据 ### CreeperModule - 🐞Bug: **#00003** `BarrageSaveFile` 文件初始化失败 - ⛏修复: 修复 **#00003**, 应该创建主播文件夹但是创建的是文件,将主播文件创建修改成主播文件夹创建 +- ❌移除: `BarrageSaveFile`的文件缓存不再加入`FileCacheManager`,因为弹幕文件几乎不会再进行修改,所以不让弹幕文件缓存占用轮询队列 ------ ## [V 1.0.5] - 2023.4.28 diff --git a/CreeperModule/src/main/java/org/example/Test.java b/CreeperModule/src/main/java/org/example/Test.java index da042a4..bb28f44 100644 --- a/CreeperModule/src/main/java/org/example/Test.java +++ b/CreeperModule/src/main/java/org/example/Test.java @@ -39,5 +39,9 @@ public class Test { System.out.println(dsmTask + "(运行状态):" + manager.isTaskRunning(dsmTask)); System.out.println(dsmTask + "(缓存中弹幕条数):" + manager.getCacheSize(dsmTask)); } + + while(true){ + + } } } diff --git a/CreeperModule/src/main/java/org/example/core/pipeline/PipelineWriteJson.java b/CreeperModule/src/main/java/org/example/core/pipeline/PipelineWriteJson.java index 1e6887c..ed5c1e5 100644 --- a/CreeperModule/src/main/java/org/example/core/pipeline/PipelineWriteJson.java +++ b/CreeperModule/src/main/java/org/example/core/pipeline/PipelineWriteJson.java @@ -32,8 +32,7 @@ public class PipelineWriteJson implements Pipeline { this.loadConfig = loadConfig; this.cache = new ConcurrentLinkedQueue<>(); this.barrageSaveFile = new BarrageSaveFile(loadConfig, cache); - this.filecache = new FileCache(barrageSaveFile); - FileCacheManagerInstance.getInstance().addFileCache(filecache); + this.filecache = new FileCache(barrageSaveFile,0,10*1024); } catch (FileCacheException e) { throw new RuntimeException(e); } @@ -57,7 +56,9 @@ public class PipelineWriteJson implements Pipeline { Barrage barrage; while ((barrage = cache.poll()) != null) { - System.out.print("写入:" + successCount); + if(successCount%1000==0){ + System.out.print("写入:" + successCount); + } try { filecache.append(barrage, "-1"); } catch (InterruptedException | FileCacheException e) { @@ -65,7 +66,7 @@ public class PipelineWriteJson implements Pipeline { } successCount++; } - + filecache.forceSync(); return successCount; } diff --git a/CreeperModule/src/main/java/org/example/pojo/configfile/BarrageSaveFile.java b/CreeperModule/src/main/java/org/example/pojo/configfile/BarrageSaveFile.java index f0ee608..f427968 100644 --- a/CreeperModule/src/main/java/org/example/pojo/configfile/BarrageSaveFile.java +++ b/CreeperModule/src/main/java/org/example/pojo/configfile/BarrageSaveFile.java @@ -45,10 +45,13 @@ public class BarrageSaveFile extends ConfigFile> setFileName(fileName); String rootPath = Paths.get(BARRAGE_ROOT, loadConfig.getAnchorName()).toString(); //获取当前主播的文件夹路径 setFilePath(rootPath); - + Path path = Path.of(rootPath); //TODO 待移除 建立主播文件夹 try { - Files.createDirectory(Path.of(rootPath)); + if(!Files.exists(path)){ + Files.createDirectory(path); + } + } catch (IOException e) { return false; } diff --git a/FileModule/src/main/java/org/example/cache/FileCache.java b/FileModule/src/main/java/org/example/cache/FileCache.java index 9530419..5beef05 100644 --- a/FileModule/src/main/java/org/example/cache/FileCache.java +++ b/FileModule/src/main/java/org/example/cache/FileCache.java @@ -127,7 +127,7 @@ public class FileCache { Object jsonData = writeInData(isAppend,data,keys); if(Objects.isNull(jsonData)){return 0;} - ConcurrentHashMap temp = new ConcurrentHashMap<>(jsonFile); + ConcurrentHashMap temp = new ConcurrentHashMap<>(JSONObject.parseObject(JSON.toJSONString(jsonFile),Map.class)); int newBytes = writeByte.updateAndGet(x -> x + writeBytes >= MAX_WRITE_BUFFER_LIMIT ? 0 : x + writeBytes); //TODO 此处会发生脏读问题,即put进入的Map版本不是当前版本,但是目前没有发现该问题是否会影响到文件写入 @@ -245,7 +245,7 @@ public class FileCache { return; } clearWriteBytes(); - ConcurrentHashMap temp = new ConcurrentHashMap<>(jsonFile); + ConcurrentHashMap temp = new ConcurrentHashMap<>(JSONObject.parseObject(JSON.toJSONString(jsonFile),Map.class)); try { syncChannel.put(temp); } catch (InterruptedException e) { diff --git a/console/src/main/java/org/example/ConsoleApplication.java b/console/src/main/java/org/example/ConsoleApplication.java index 9dde818..c1604c3 100644 --- a/console/src/main/java/org/example/ConsoleApplication.java +++ b/console/src/main/java/org/example/ConsoleApplication.java @@ -5,10 +5,13 @@ import org.example.exception.FileCacheException; import org.example.init.FileCacheManagerInit; import org.example.init.InitWorld; import org.example.init.ModuleSrcConfigFileInit; +import org.example.pojo.configfile.BarrageSaveFile; +import org.example.pojo.download.LoadConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; /** * @author Genius @@ -20,6 +23,8 @@ public class ConsoleApplication { public static void main(String[] args) throws FileCacheException { + LoadConfig loadConfig = new LoadConfig("斗鱼","Post","大司马"); + BarrageSaveFile barrageSaveFile = new BarrageSaveFile(loadConfig,new ConcurrentLinkedQueue<>()); if (Init()) { SpringApplication.run(ConsoleApplication.class, args); }