事件
通过 device.getEvents() 订阅运行态事件。
自动日志
每个事件触发时都会再打 addLoggedListener(等级跟随源事件),无论是否另订了对应事件。绑 addLoggedListener 即可收到中文消息。
先订阅,再读运行态,才会比对变化并回调。第一次只记当前状态,不发事件。
功能概览
| 类别 | 事件 | 说明 | 自动日志 |
|---|---|---|---|
| 连接 | device.getEvents().addConnectedChangedListener | 与 IO 控制器的周期交换通断 | ✓ |
| 运行态 | device.getEvents().addStateChangedListener | 运行态变化 | ✓ |
| 运行错误 | device.getEvents().addErrorOccurredListener | 运行错误 | ✓ |
| IO 质量 | device.getEvents().addIoStatusChangedListener | 非 GOOD 字节计数变化 | ✓ |
| 链路 | device.getEvents().addLinkChangedListener | 网卡物理链路变化 | ✓ |
| 日志 | device.getEvents().addLoggedListener | 上面每条事件都会再打这条 | — |
连接
addConnectedChangedListener
public void addConnectedChangedListener(Consumer<ConnectedChanged> listener)
周期数据交换通断时触发(isConnected() == false 且 isEverConnected() == true = 掉线;isEverConnected() == false = 从未连上)。
回调参数:
public static final class ConnectedChanged {
public boolean isConnected() { } // 当前是否在换周期数据
public boolean isEverConnected() { } // 是否曾经连上过
public PnSEventLevel getLevel() { } // 连接 = INFO;掉线 / 从未连上 = WARN
}
示例:
device.getEvents().addConnectedChangedListener(e -> {
if (!e.isConnected() && e.isEverConnected())
System.out.println("掉线");
});
运行态
addStateChangedListener
public void addStateChangedListener(Consumer<StateChanged> listener)
运行态变化时触发(SDK 只观测,不主动切状态)。
回调参数:
public static final class StateChanged {
public PnSState getOldState() { } // 变化前,见 [PnSState](./api#pnsstate)
public PnSState getNewState() { } // 变化后
public PnSEventLevel getLevel() { } // INFO
}
示例:
device.getEvents().addStateChangedListener(e ->
System.out.println(e.getOldState() + " → " + e.getNewState()));
addErrorOccurredListener
public void addErrorOccurredListener(Consumer<ErrorOccurred> listener)
运行错误出现时触发;e.getErrorCode() 是 int 原值,枚举形态请用 device.getErrorCodeEnum()。
回调参数:
public static final class ErrorOccurred {
public int getErrorCode() { } // 运行错误原值(不是枚举)
public String getMessage() { } // 中文消息。缺失为空串
public PnSEventLevel getLevel() { } // WARN
}
示例:
device.getEvents().addErrorOccurredListener(e ->
System.out.println(e.getErrorCode() + ": " + e.getMessage()));
addIoStatusChangedListener
public void addIoStatusChangedListener(Consumer<IoStatusChanged> listener)
第一次读到 IOPS 只记基线,不回调。inputIopsHex 与 outputIopsHex 都缺则不虚构、不回调。非 GOOD 字节计数变化才回调(0 = 全 GOOD)。六种语言同一口径,不是每次读都回调。
回调参数:
public static final class IoStatusChanged {
public int getIopsBad() { } // BAD 字节计数
public PnSEventLevel getLevel() { } // >0 = WARN;0 = INFO
}
addLinkChangedListener
public void addLinkChangedListener(Consumer<LinkChanged> listener)
网卡物理链路变化时触发(仅当状态里真有 linkUp 字段才派发)。
回调参数:
public static final class LinkChanged {
public boolean isLinkUp() { } // 链路是否 Up
public PnSEventLevel getLevel() { } // Up = INFO;Down = WARN
}
日志
addLoggedListener
public void addLoggedListener(BiConsumer<PnSEventLevel, String> listener)
每个事件触发时都会再打这条,等级跟随源事件。
回调参数:
level(PnSEventLevel) — 日志级别message(String) — 日志正文
PnSEventLevel
日志级别。取值见 枚举参考。
示例:
device.getEvents().addLoggedListener((level, message) ->
System.out.println("[" + level + "] " + message));
线程安全
事件回调不在 UI 线程上触发。更新界面时需要线程同步:
// Swing
device.getEvents().addConnectedChangedListener(e ->
SwingUtilities.invokeLater(() ->
labelStatus.setText(e.isConnected() ? "已连接" : "未连接")));
// JavaFX
device.getEvents().addConnectedChangedListener(e ->
Platform.runLater(() ->
statusText.set(e.isConnected() ? "已连接" : "未连接")));