类 DiagnosticQueue
java.lang.Object
com.darra.ethercat.sugar.DiagnosticQueue
- 所有已实现的接口:
AutoCloseable
诊断事件 ->
BlockingQueue 适配器.
主线 SDK 用回调 接收事件 (addEmergencyEventListener). 回调方便,
但有两个痛点:
- 回调在原生 PDO 线程触发, 业务方做 IO/慢操作会阻塞 PDO 周期
- 多生产者-单消费者场景需要自己加锁/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
-
嵌套类概要
嵌套类 -
方法概要
修饰符和类型方法说明static DiagnosticQueueattach(EtherCATMaster master, int capacity) 创建并注册到 master.static DiagnosticQueueattachStrict(EtherCATMaster master, int capacity) 创建并注册到 master.voidclose()booleanisStrict()是否使用严格模式 (回调阻塞).带超时取一条, 超时返回 null.pollNow()非阻塞取一条, 队列空返回 null.queue()暴露原始队列 (供drainTo / iterator等).intsize()当前队列长度.take()阻塞取一条 (无超时).
-
方法详细资料
-
attach
创建并注册到 master. 容量满时丢弃最旧事件 (推荐 — 不阻塞 PDO). -
attachStrict
创建并注册到 master. 容量满时阻塞回调线程 直到有空间. 慎用 — 会反压 整个 PDO 线程. -
take
阻塞取一条 (无超时). -
poll
带超时取一条, 超时返回 null. -
pollNow
非阻塞取一条, 队列空返回 null. -
size
public int size()当前队列长度. -
isStrict
public boolean isStrict()是否使用严格模式 (回调阻塞). -
queue
暴露原始队列 (供drainTo / iterator等). -
close
public void close()- 指定者:
close在接口中AutoCloseable
-