跳到主要内容

Modify

前置阅读

sub.modify(...)

修改 Subscription 的发布参数 (ModifySubscription 服务):

public ModifySubscriptionResult modify(double publishingIntervalMs);
public ModifySubscriptionResult modify(double publishingIntervalMs,
int lifetimeCount,
int maxKeepAliveCount,
int maxNotificationsPerPublish,
byte priority);
参数默认 (短重载)含义
publishingIntervalMs新发布间隔
lifetimeCount1200多少个 publish 周期没收到 PublishRequest 就清理订阅
maxKeepAliveCount50没新数据时多久发一次空 KeepAlive
maxNotificationsPerPublish0单次 Publish 最多发多少条通知, 0 = 不限
priority0优先级

返回 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 = 尽快
queueSize1服务端缓冲队列长度
discardOldesttruetrue = 丢最旧, 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) 适合"采样不能漏"的高频数据.

下一步