You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Eclipse Milo连接OPC UA服务器遇StacklessClosedChannelException求助

问题

使用Eclipse Milo连接OPC UA服务器时抛出StacklessClosedChannelException异常,但OPCUA Explorer等客户端能正常连接并读取变量。

代码片段

int codMacchina = macchina.getCodMacchina();
String ipServer = macchina.getIpServer();
String porta = macchina.getPorta();
String username = macchina.getUsername();
String password = macchina.getPassword();

try {
    List<EndpointDescription> endpoints = 
    DiscoveryClient.getEndpoints("opc.tcp://" + ipServer + ":" + porta).get();
    EndpointDescription configPoint = endpoints.get(0);
   
    OpcUaClientConfigBuilder cfg = new OpcUaClientConfigBuilder();
    cfg.setEndpoint(configPoint);
    cfg.setIdentityProvider(new UsernameProvider(username, password));

    OpcUaClient client = OpcUaClient.create(cfg.build());
    CompletableFuture<UaClient> cf = client.connect();
    cf.get();

.....

堆栈跟踪

[2023-06-13][15:16:28:847][ERROR][AbstractLoggingWriter][71][java.util.concurrent.ExecutionException: io.netty.channel.StacklessClosedChannelException
]
[2023-06-13][15:16:28:885][ERROR][AbstractLoggingWriter][71][   at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:395)
]
[2023-06-13][15:16:28:899][ERROR][AbstractLoggingWriter][71][   at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1999)
]
[2023-06-13][15:16:28:913][ERROR][AbstractLoggingWriter][71][   at deployment.GnuttiHubEar.ear.GnuttiHub.war//it.gnuttihub.job.ImportaDatiOPCUAJob.lambda$0(ImportaDatiOPCUAJob.java:70)
]
[2023-06-13][15:16:28:932][ERROR][AbstractLoggingWriter][71][   at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1654)
]
[2023-06-13][15:16:28:947][ERROR][AbstractLoggingWriter][71][   at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)
]
[2023-06-13][15:16:28:961][ERROR][AbstractLoggingWriter][71][   at deployment.GnuttiHubEar.ear.GnuttiHub.war//it.gnuttihub.job.ImportaDatiOPCUAJob.executeJob(ImportaDatiOPCUAJob.java:53)
]
[2023-06-13][15:16:28:974][ERROR][AbstractLoggingWriter][71][   at deployment.GnuttiHubEar.ear.GnuttiHub.war//it.gnuttihub.job.AbstractJob.execute(AbstractJob.java:24)
]
[2023-06-13][15:16:28:988][ERROR][AbstractLoggingWriter][71][   at deployment.GnuttiHubEar.ear.GnuttiHub.war//org.quartz.core.JobRunShell.run(JobRunShell.java:202)
]
[2023-06-13][15:16:29:001][ERROR][AbstractLoggingWriter][71][   at deployment.GnuttiHubEar.ear.GnuttiHub.war//org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
]
[2023-06-13][15:16:29:018][ERROR][AbstractLoggingWriter][71][Caused by: io.netty.channel.StacklessClosedChannelException
]
[2023-06-13][15:16:29:031][ERROR][AbstractLoggingWriter][71][   at io.netty.channel.AbstractChannel$AbstractUnsafe.ensureOpen(ChannelPromise)(Unknown Source)]
排查与修复方向
  • 端点选择不匹配:直接取endpoints.get(0)可能选中了服务器不兼容的端点(如安全策略、加密方式不匹配)。OPCUA Explorer会自动筛选兼容端点,建议遍历所有端点,打印其安全策略、消息模式,选择与OPCUA Explorer一致的端点。
  • Netty版本冲突:Milo对Netty版本有严格依赖,项目中若存在冲突的Netty版本,会导致通道异常。通过Maven/Gradle依赖树排查,排除冲突的Netty依赖,保持与Milo依赖版本一致。
  • 同步阻塞导致超时:cf.get()会同步阻塞线程,若服务器响应慢或网络波动,易引发通道关闭。建议改用异步回调处理连接结果,或设置超时时间:cf.get(5, TimeUnit.SECONDS)。
  • 安全配置缺失:部分服务器要求特定安全配置,比如信任服务器证书。Milo默认证书处理逻辑与OPCUA Explorer不同,可手动配置证书验证(测试环境可临时跳过):
    cfg.setCertificateValidator(new CertificateValidator() {
        @Override
        public void validateCertificate(X509Certificate certificate) throws CertificateValidationException {
            // 测试环境下跳过证书校验
        }
    });
    
  • 客户端生命周期问题:若OpcUaClient为局部变量,可能被提前GC导致通道关闭。建议将其声明为类成员变量,确保实例被正确持有。

内容的提问来源于stack exchange,提问作者Giuseppe Castellano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:38:10