Modify
前置阅读
- 创建订阅请看 创建 Subscription.
- 整条订阅启停 / 单 MI 启停请看 SetMonitoringMode.
sub.modify(...)
修改 Subscription 的发布参数 (ModifySubscription 服务):
public ModifySubscriptionResult modify(double publishingIntervalMs);
public ModifySubscriptionResult modify(double publishingIntervalMs,
int lifetimeCount,
int maxKeepAliveCount,
int maxNotificationsPerPublish,
byte priority);
| 参数 | 默认 (短重载) | 含义 |
|---|---|---|
publishingIntervalMs | — | 新发布间隔 |
lifetimeCount | 1200 | 多少个 publish 周期没收到 PublishRequest 就清理订阅 |
maxKeepAliveCount | 50 | 没新数据时多久发一次空 KeepAlive |
maxNotificationsPerPublish | 0 | 单次 Publish 最多发多少条通知, 0 = 不限 |
priority | 0 | 优先级 |
返回 ModifySubscriptionResult, 字段:
| 方法 | 类型 | 说明 |
|---|---|---|
getRevisedPublishingIntervalMs() | double | 服务端实际生效的间隔 |
getRevisedLifetimeCount() | int | 服务端实际生效的 lifetime |
getRevisedMaxKeepAliveCount() | int | 服务端实际生效的 keepAlive |
ModifySubscriptionResult rev = sub.modify(1000.0, 600, 30, 0, (byte) 0);
System.out.println("Revised publishing interval = "
+ rev.getRevisedPublishingIntervalMs() + "ms");
sub.modifyMonitoredItems(requests)
批量修改 MI 采样参数 (ModifyMonitoredItems 服务):
public List<ModifyMonitoredItemResult> modifyMonitoredItems(
List<MonitoredItemModifyRequest> requests);
MonitoredItemModifyRequest 字段:
| 字段 | 默认 | 说明 |
|---|---|---|
monitoredItemHandle | — | 本地 MI 句柄 |
samplingIntervalMs | -1 | -1 = 跟订阅, 0 = 尽快 |
queueSize | 1 | 服务端缓冲队列长度 |
discardOldest | true | true = 丢最旧, false = 丢最新 |
返回 ModifyMonitoredItemResult:
| 方法 | 说明 |
|---|---|
getStatus() | 修改结果 |
getRevisedSamplingIntervalMs() | 服务端实际采样间隔 |
getRevisedQueueSize() | 服务端实际队列大小 |
import java.util.stream.Collectors;
List<MonitoredItemModifyRequest> requests = miHandles.stream()
.map(h -> new MonitoredItemModifyRequest(h, 50.0, 10, true))
.collect(Collectors.toList());
List<ModifyMonitoredItemResult> results = sub.modifyMonitoredItems(requests);
for (ModifyMonitoredItemResult r : results) {
System.out.println(r); // ModifyMonitoredItemResult{status=Good, interval=50.0ms, queueSize=10}
}
sub.modifyItem(...) 单 MI 简化版
public ModifyMonitoredItemResult modifyItem(int monitoredItemHandle, double samplingIntervalMs);
public ModifyMonitoredItemResult modifyItem(int monitoredItemHandle,
double samplingIntervalMs,
int queueSize,
boolean discardOldest);
ModifyMonitoredItemResult r = sub.modifyItem(handle, 50.0);
System.out.println("Revised sampling = " + r.getRevisedSamplingIntervalMs() + "ms");
QueueSize 与 DiscardOldest
服务端为每个 MI 维护一个先进先出队列. 当客户端 Publish 来不及取时, 队列满了:
discardOldest = true(默认) → 丢最旧, 保留最新discardOldest = false→ 丢最新, 保留最旧
queueSize = 1 (默认) 只保留最新值, 适合"实时显示"; queueSize = N (N > 1) 适合"采样不能漏"的高频数据.