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 末页避免泄漏.