/// <summary> /// 消息分发 读文件 /// </summary> /// <param name="node">消息分发节点</param> /// <param name="config">消息分发 读取配置</param> internal DistributionFileReader(Distributor node, DistributionConfig config) : base(node.Writer, config ?? defaultConfig) { Node = node; timeoutTicks = Math.Max((config ?? defaultConfig).TimeoutSeconds, 1) * -TimeSpan.TicksPerSecond; ReaderIndex = -1; int isReader = 0; writerAppendIdentity = Writer.NewRead(); try { loadStateFile(); long fileIndex = 0; if (loadIndex(ref fileIndex)) { messages = new DistributionMessageItem[(int)Config.MemoryCacheNodeCount + FileWriter.MaxPacketCount + 1]; if (Identity == writerAppendIdentity) { isReader = 1; } else { loadFile(fileIndex); if (loadFile()) { sendIdentity = Identity; sendMessageIndex = 0; isReader = 1; } } } } finally { if (isReader == 0) { Dispose(); } else { DistributionFileReaderTimeout.AddReader(this); } } }
/// <summary> /// 释放资源 /// </summary> public void Dispose() { if (Interlocked.CompareExchange(ref isDisposed, 1, 0) == 0) { DistributionFileReaderTimeout.RemoveReader(this); dispose(); while (messageIndex != writeMessageIndex) { messages[messageIndex].FreeBuffer(); if (++messageIndex == messages.Length) { messageIndex = 0; } } while (getterCount != 0) { getters[--getterCount].OnDispose(); } getterIndex = 0; } }