TsgcWebSocketServer › 属性 › QueueOptions
通过内部每连接队列序列化出站消息,以防止线程间的竞争。
property QueueOptions: TsgcWSQueueServer_Options read FQueueOptions write SetQueueOptions;
Text.Level=qmNone, Binary.Level=qmNone, Ping.Level=qmNone, MaxQueueSize=0, OverflowPolicy=qopDropOldest, DrainedMode=qdmTransition
启用后,消息将放入内部队列,并在连接线程的上下文中发送,而非在调用方线程中发送,从而消除多个线程同时写入同一连接时所需的锁定。每种消息类型(Text、Binary、Ping)都是一个子对象,各自拥有自己的 Level 属性,用于指定独立的优先级:qmNone 跳过队列(默认),qmLevel0 最先处理,其次是 qmLevel1,最后是 qmLevel2。例如,将 Text.Level 和 Binary.Level 设为 qmLevel2,将 Ping.Level 设为 qmLevel1,可保证 ping 先于普通流量投递。QueueOptions 仅受默认 IOHandler 支持。当 IOHandlerOptions.IOHandlerType 为 iohIOCP 或 iohEPOLL 时,队列会在服务器启动时被关闭:三个级别都会重置为 qmNone,OnError 事件会报告此情况,消息将在调用方线程上内联写出。在服务器已经开始侦听之后再指定级别,也会在每个新连接上以同样的方式被重置。
MaxQueueSize 限制每个连接队列可容纳的消息数量:零(默认值)表示不设上限,保持以前的行为。达到上限时,OverflowPolicy 决定新消息的处理方式:qopDropOldest(默认值)丢弃队列中最旧的消息以腾出空间,qopDropNewest 丢弃新消息,qopDisconnect 丢弃新消息并关闭连接。每次达到上限时,都会先触发 OnSendBufferFull 事件,使应用程序能够检测慢速消费者或覆盖丢弃行为。
DrainedMode 用于选择何时触发 OnQueueDrained 事件。使用 qdmTransition(默认值)时,每当连接的出站队列由有消息变为空时,该事件触发一次。使用 qdmEveryPass 时,它会在连接循环的每一次传递中、队列发送完毕之后立即触发,即使队列本来就是空的,也即使 Text.Level、Binary.Level 和 Ping.Level 全部为 qmNone,因此无需设置虚设的队列级别。它可用作在连接自身线程上运行的每连接钩子,例如使用 WriteData 发送待处理的应用程序数据。该事件不遵循 NotifyEvents,因此处理程序必须足够快,并且不得操作用户界面。只有默认 IOHandler 具有此循环,使用 iohIOCP 和 iohEPOLL 时,该事件永远不会按每次传递触发。每个连接在建立时会复制队列选项,因此请在激活组件之前设置 DrainedMode,已经打开的连接保持之前的模式。
oServer := TsgcWebSocketServer.Create(nil);
oServer.QueueOptions.Text.Level := qmLevel2;
oServer.QueueOptions.Binary.Level := qmLevel2;
oServer.QueueOptions.Ping.Level := qmLevel1;
oServer.Active := true;