Cumulocity Java SDK微服务订阅连接异常求助
Cumulocity微服务启动后订阅服务连接失败问题解决
问题核心
微服务部署到Cumulocity平台后,未调用任何自定义API就触发IO异常,提示The server cumulocity failed to respond,栈追踪显示调用GET http://cumulocity:8111/application/currentApplication时出现Connection reset,MicroserviceSubscriptionsServiceImpl.subscribe方法反复重试仍失败。
排查与解决步骤
1. 验证内部服务网络连通性
- 主机名解析检查:在微服务容器内执行
ping cumulocity,确认能正常解析到Cumulocity内部服务的IP。若解析失败,需排查平台DNS配置或服务发现机制是否正常。 - 端口连通性测试:使用
telnet cumulocity 8111或nc -zv cumulocity 8111测试8111端口是否开放并可连接。若不通,说明网络策略(如Kubernetes Service/NetworkPolicy、Docker网络)阻止了流量,或Cumulocity内部服务未正常监听该端口。
2. 检查Cumulocity内部服务状态
8111端口对应Cumulocity的application-service,需确认该服务:
- Pod/容器是否正常启动,无崩溃或重启记录
- 服务日志中是否有启动失败、端口绑定失败等异常信息
- 服务是否正确暴露8111端口(如Kubernetes Service的targetPort配置)
3. 核对微服务配置参数
- 确认微服务的环境变量
C8Y_BASEURL或配置文件中的内部服务地址是否正确,默认内部调用依赖cumulocity主机名指向平台内部服务。 - 检查微服务使用的服务账号权限,确保拥有访问
/application/currentApplication接口的权限(尽管连接重置更偏向网络问题,但权限异常也可能导致服务端主动断开连接)。
4. 调整HTTP客户端连接配置
针对连接重置问题,可尝试调整SDK的HTTP客户端参数:
- 增加连接超时与读取超时时间
- 启用TCP Keep-Alive机制,避免连接被中间网络设备主动断开
- 调整重试策略的间隔时间,避免短时间内频繁重试导致服务端拒绝连接
相关日志与代码
完整栈追踪
2023-04-07 11:15:55.594 ERROR 11 --- [subscriptions-0] c.m.s.s.MicroserviceSubscriptionsService : Error while reacting on microservice subscription com.cumulocity.sdk.client.SDKException: Error invoking GET http://cumulocity:8111/application/currentApplication at com.cumulocity.microservice.subscription.repository.impl.CurrentMicroserviceRepository.handleException(CurrentMicroserviceRepository.java:114) at com.cumulocity.microservice.subscription.repository.impl.CurrentMicroserviceRepository.getCurrentApplication(CurrentMicroserviceRepository.java:69) at com.cumulocity.microservice.subscription.repository.impl.CurrentMicroserviceRepository.register(CurrentMicroserviceRepository.java:46) at com.cumulocity.microservice.subscription.repository.impl.CurrentMicroserviceRepository.register(CurrentMicroserviceRepository.java:61) at com.cumulocity.microservice.subscription.repository.MicroserviceSubscriptionsRepository.register(MicroserviceSubscriptionsRepository.java:103) at com.cumulocity.microservice.subscription.service.impl.MicroserviceSubscriptionsServiceImpl.subscribe(MicroserviceSubscriptionsServiceImpl.java:113) at com.cumulocity.microservice.subscription.service.impl.MicroserviceSubscriptionScheduler$1.run(MicroserviceSubscriptionScheduler.java:66) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:750) Caused by: com.sun.jersey.api.client.ClientHandlerException: java.net.SocketException: Connection reset at com.sun.jersey.client.apache.DefaultApacheHttpMethodExecutor.executeMethod(DefaultApacheHttpMethodExecutor.java:213) at com.sun.jersey.client.apache.ApacheHttpClientHandler.handle(ApacheHttpClientHandler.java:175) at com.cumulocity.sdk.client.CumulocityAuthenticationFilter.handle(CumulocityAuthenticationFilter.java:47) at com.sun.jersey.api.client.Client.handle(Client.java:648) at com.sun.jersey.api.client.WebResource.handle(WebResource.java:670) at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:503) at com.cumulocity.sdk.client.RestConnector.getClientResponse(RestConnector.java:149) at com.cumulocity.sdk.client.RestConnector.get(RestConnector.java:123) at com.cumulocity.microservice.subscription.repository.application.CurrentApplicationApi.get(CurrentApplicationApi.java:22) at com.cumulocity.microservice.subscription.repository.impl.CurrentMicroserviceRepository.getCurrentApplication(CurrentMicroserviceRepository.java:67) ... 12 common frames omitted Caused by: java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:210) at java.net.SocketInputStream.read(SocketInputStream.java:141) at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) at java.io.BufferedInputStream.read(BufferedInputStream.java:265) at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78) at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106) at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1116) at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.readLine(MultiThreadedHttpConnectionManager.java:1413) at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1973) at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1735) at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1098) at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398) at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) at com.sun.jersey.client.apache.DefaultApacheHttpMethodExecutor.executeMethod(DefaultApacheHttpMethodExecutor.java:210) ... 22 common frames omitted 2023-04-07 11:23:26.437 INFO 11 --- [subscriptions-0] o.a.c.httpclient.HttpMethodDirector : I/O exception (org.apache.commons.httpclient.NoHttpResponseException) caught when processing request: The server cumulocity failed to respond 2023-04-07 11:23:26.437 INFO 11 --- [subscriptions-0] o.a.c.httpclient.HttpMethodDirector : Retrying request 2023-04-07 11:28:37.056 INFO 11 --- [subscriptions-0] o.a.c.httpclient.HttpMethodDirector : I/O exception (org.apache.commons.httpclient.NoHttpResponseException) caught when processing request: The server cumulocity failed to respond 2023-04-07 11:28:37.056 INFO 11 --- [subscriptions-0] o.a.c.httpclient.HttpMethodDirector : Retrying request 2023-04-07 11:41:18.465 INFO 11 --- [subscriptions-0] o.a.c.httpclient.HttpMethodDirector : I/O exception (org.apache.commons.httpclient.NoHttpResponseException) caught when processing request: The server cumulocity failed to respond 2023-04-07 11:41:18.465 INFO 11 --- [subscriptions-0] o.a.c.httpclient.HttpMethodDirector : Retrying request 2023-04-07 11:44:18.805 INFO 11 --- [subscriptions-0] o.a.c.httpclient.HttpMethodDirector : I/O exception (org.apache.commons.httpclient.NoHttpResponseException) caught when processing request: The server cumulocity failed to respond 2023-04-07 11:44:18.805 INFO 11 --- [subscriptions-0] o.a.c.httpclient.HttpMethodDirector : Retrying request 2023-04-07 11:47:49.211 INFO 11 --- [subscriptions-0] o.a.c.httpclient.HttpMethodDirector : I/O exception (org.apache.commons.httpclient.NoHttpResponseException) caught when processing request: The server cumulocity failed to respond 2023-04-07 11:47:49.211 INFO 11 --- [subscriptions-0] o.a.c.httpclient.HttpMethodDirector : Retrying request 2023-04-07 12:03:51.343 INFO 11 --- [subscriptions-0] o.a.c.httpclient.HttpMethodDirector : I/O exception (org.apache.commons.httpclient.NoHttpResponseException) caught when processing request: The server cumulocity failed to respond 2023-04-07 12:03:51.343 INFO 11 --- [subscriptions-0] o.a.c.httpclient.HttpMethodDirector : Retrying request 2023-04-07 12:12:32.323 ERROR 11 --- [subscriptions-0] c.m.s.s.MicroserviceSubscriptionsService : Error while reacting on microservice subscription
服务类自动装配代码
@Autowired private MicroserviceSubscriptionsService subscriptionsService;
SDK subscribe方法代码
public void subscribe() { synchronized(this.$lock) { try { this.subscribing = true; this.subscribingCredentials.clear(); Optional<ApplicationRepresentation> maybeApplication = this.repository.register(this.properties.getApplicationName(), this.microserviceMetadataRepresentation); if (this.registeredSuccessfully = maybeApplication.isPresent()) { final ApplicationRepresentation application = (ApplicationRepresentation)maybeApplication.get(); final MicroserviceSubscriptionsRepository.Subscriptions subscriptions = this.repository.retrieveSubscriptions(application.getId()); FluentIterable.from(subscriptions.getRemoved()).filter(new Predicate<MicroserviceCredentials>() { public boolean apply(MicroserviceCredentials user) { MicroserviceSubscriptionsServiceImpl.this.log("Remove subscription: {}", user); Iterator var2 = MicroserviceSubscriptionsServiceImpl.this.listeners.iterator(); MicroserviceChangedListener listener; do { if (!var2.hasNext()) { return true; } listener = (MicroserviceChangedListener)var2.next(); } while(MicroserviceSubscriptionsServiceImpl.this.invokeRemoved(user, listener)); return false; } }).toList(); final ImmutableList<MicroserviceCredentials> successfullyAdded = FluentIterable.from(subscriptions.getAdded()).filter(new Predicate<MicroserviceCredentials>() { public boolean apply(MicroserviceCredentials user) { MicroserviceSubscriptionsServiceImpl.this.log("Add subscription: {}", user); MicroserviceCredentials enhancedUser = MicroserviceCredentials.copyOf(user).appKey(application.getKey()).build(); MicroserviceSubscriptionsServiceImpl.this.subscribingCredentials.add(enhancedUser); Iterator var3 = MicroserviceSubscriptionsServiceImpl.this.listeners.iterator(); MicroserviceChangedListener listener; do { if (!var3.hasNext()) { return true; } listener = (MicroserviceChangedListener)var3.next(); } while(MicroserviceSubscriptionsServiceImpl.this.invokeAdded(enhancedUser, listener)); MicroserviceSubscriptionsServiceImpl.this.subscribingCredentials.remove(enhancedUser); return false; } }).toList(); this.repository.updateCurrentSubscriptions(FluentIterable.from(subscriptions.getAll()).filter(new Predicate<MicroserviceCredentials>() { public boolean apply(MicroserviceCredentials user) { return subscriptions.getAdded().contains(user) ? successfullyAdded.contains(user) : true; } }).toList()); } else { log.error("Application {} not found", this.properties.getApplicationName()); } } catch (Throwable var11) { log.error("Error while reacting on microservice subscription", var11); } finally { this.subscribingCredentials.clear(); this.subscribing = false; } } }
内容的提问来源于stack exchange,提问作者Datta Sai
相关产品推荐
相关产品推荐

