跳到主要内容

BrowseWithPaging

browse 只返回 References 列表, 丢弃 ContinuationPoint, 适合"已知小节点"场景. 大节点 (子节点 100+) 用 browseWithPaging 显式拿到 BrowsePage.

前置阅读
  • 续翻分页用 BrowseNext.
  • 一步到位的 browseAll 内部就是循环 browseWithPaging + browseNext.

签名

public BrowsePage browseWithPaging(String nodeId);
public BrowsePage browseWithPaging(String nodeId, Enums.NodeClass filter);

用法

BrowsePage page = ua.browseWithPaging("ns=2;s=BigFolder");
System.out.println("Got " + page.getReferences().size()
+ " children, more = " + page.hasMore());

if (page.hasMore()) {
BrowsePage next = ua.browseNext(page.getContinuationPoint(), false);
System.out.println("Next page: " + next.getReferences().size() + " more children");
}

何时用 browse vs browseWithPaging vs browseAll

场景API
已知节点子数 ≤ 50, 不关心分页browse(...)
不确定子数, 安全起见browseWithPaging(...) + 循环 browseNext
100+ 子节点的大节点browseAll(...) (内部自动分页)
一次 browse 多个节点browseMany(...) (注意当前 browseMany 不返回 ContinuationPoint)

完整模板

SDK 已内置, 直接用即可:

public List<Reference> browseAll(String nodeId);
public List<Reference> browseAll(String nodeId, Enums.NodeClass filter, int maxPages);

源码等价实现 (供参考自定义):

import com.darra.opcua.*;
import java.util.ArrayList;
import java.util.List;

public static List<Reference> browseAll(
OpcUaSession ua,
String nodeId,
Enums.NodeClass filter) {
List<Reference> all = new ArrayList<>();
BrowsePage page = ua.browseWithPaging(nodeId, filter);
all.addAll(page.getReferences());
while (page.hasMore()) {
page = ua.browseNext(page.getContinuationPoint(), false);
all.addAll(page.getReferences());
}
return all;
}

browseAll 默认上限 32 页, 超过会自动 release 末页避免泄漏.

下一步