示例#1
0
        /// <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);
                }
            }
        }
示例#2
0
 /// <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;
     }
 }