import com.darra.opcua.*;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;
try (DarraOpcUa ua = new DarraOpcUa("opc.tcp://localhost:4840")) {
ua.connect();
BrowseCrawler crawler = new BrowseCrawler(ua, 8, 50_000, NodeClass.Unspecified);
BiConsumer<Integer, String> progress = (count, nid) ->
System.out.printf("\r已抓 %d 个, 当前 %s", count, nid);
CompletableFuture<CrawlResult> fut = crawler.crawlAsync(
WellKnownNodes.OBJECTS_FOLDER, progress);
CrawlResult result = fut.get();
System.out.printf("%n共 %d 节点, 耗时 %.1fs%n",
result.allNodes.size(), result.elapsed.toMillis() / 1000.0);
BrowseCrawler c2 = new BrowseCrawler(ua, 10, 100_000, NodeClass.Variable);
CrawlResult r2 = c2.crawlAsync("ns=2;s=Boilers", null).get();
for (CrawlNode n : r2.allNodes)
System.out.println(" " + n.browseName + " (" + n.nodeId + ")");
CompletableFuture<CrawlResult> fut3 = crawler.crawlAsync("i=85", null);
cancelButton.addActionListener(e -> fut3.cancel(true));
}