跳到主要内容

事件

通过 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() ? "已连接" : "未连接")));