类 DiagnosticQueue

java.lang.Object
com.darra.ethercat.sugar.DiagnosticQueue
所有已实现的接口:
AutoCloseable

public final class DiagnosticQueue extends Object implements AutoCloseable
诊断事件 -> BlockingQueue 适配器.

主线 SDK 用回调 接收事件 (addEmergencyEventListener). 回调方便, 但有两个痛点:

  1. 回调在原生 PDO 线程触发, 业务方做 IO/慢操作会阻塞 PDO 周期
  2. 多生产者-单消费者场景需要自己加锁/Queue

本类把回调一次注册, 转成线程安全的 BlockingQueue<EmergencyEvent>. 业务方自己开消费线程 take(), 解耦回调线程与业务线程.

典型用法:

 try (DiagnosticQueue dq = DiagnosticQueue.attach(master, 1024)) {
     // 后台消费
     Thread consumer = new Thread(() -> {
         while (!Thread.currentThread().isInterrupted()) {
             try {
                 EmergencyEvent ev = dq.take();
                 saveToDb(ev);  // 慢操作 — 不再阻塞 PDO
             } catch (InterruptedException e) { break; }
         }
     });
     consumer.setDaemon(true);
     consumer.start();

     // 主流程
     master.start();
     ...
 }  // close 自动反注册回调 + 清空队列
 

容量满时 attach(EtherCATMaster, int) 默认丢弃最早事件 (offer-then-poll 模式), 不阻塞回调线程 — 否则一旦消费跟不上, 整个 PDO 线程就被卡死. 业务方如果需要 "保证不丢, 反压上游", 用 attachStrict(EtherCATMaster, int).

从以下版本开始:
2026-05