你能复现一遍,然后把完整的日志传上来吗?

另外有一点要说明的是,java 环境下长链接的有效性需要应用层来保证。android 平台我们 SDK 可以在网络中断-恢复之后自动重连,是因为我们可以得到网络状态变化的系统通知,而 jvm 下 SDK 无法得到这样的通知,所以需要应用层才处理。也就是说,jvm 上要保证即时通讯的长链接有效,应用层需要做更多的事情。

链接监听也有在业务中做,显示的也是在链接状态,但是就是发送不出去消息,登录和创建会话都正常

你说在本地调试是 ok 的,只是放到测试环境就不行了,是吗?你调用 sdk 的代码能贴上来吗?另外,我想看到的是完整的 debug 日志,你可以用 log4j 将日志打印到文件,然后把日志文件传上来的。

你的 appId 是多少?

appId: AvIQcWgwhwdecvVE9zX6RDvL-gzGzoHsz

对,我本地是OK的,放到测试环境上,登录,创建会话OK,就是到发送消息就链接丢失了。方便加一下微信嘛?微信号:kevin_wang_7788

上面那已经是加了AVOSCloud.setLogLevel(AVLogger.Level.DEBUG);的所有日志了,其它的日志都是我这边的业务日志了

FINE: [Thread-133] connection is established, directly response callback...
2021-02-23 10:51:24.808 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1] INFO c.a.h.s.impl.ImLeanCloudServiceImpl - 成功建立 WebSocket 链接
Feb 23, 2021 10:51:24 AM cn.leancloud.logging.SimpleLogger internalWriteLog
FINE: [Thread-133] openClient...
Feb 23, 2021 10:51:24 AM cn.leancloud.logging.SimpleLogger internalWriteLog
FINE: [Thread-133] add request cache. client=a3969, conv=null, request=-65486
Feb 23, 2021 10:51:24 AM cn.leancloud.logging.SimpleLogger internalWriteLog
FINE: [Thread-133] enter onOperationCompleted with clientId=a3969, convId=null, requestId=-65486, operation=CLIENT_OPEN
2021-02-23 10:51:24.808 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1] INFO c.a.h.s.impl.ImLeanCloudServiceImpl - a3969用户登录!clientId=a3969;异常:null
2021-02-23 10:51:24.809 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1] INFO c.a.h.s.impl.ImLeanCloudServiceImpl - a3969用户登录成功!clientId=a3969
Feb 23, 2021 10:51:24 AM cn.leancloud.logging.SimpleLogger internalWriteLog
FINE: [Thread-133] createConversation...
Feb 23, 2021 10:51:24 AM cn.leancloud.logging.SimpleLogger internalWriteLog
FINE: [Thread-133] add request cache. client=a3969, conv=null, request=-65485
Feb 23, 2021 10:51:24 AM cn.leancloud.logging.SimpleLogger internalWriteLog
FINE: [Thread-133] ignore operation:null
2021-02-23 10:51:24.809 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1] INFO
Feb 23, 2021 10:51:24 AM cn.leancloud.logging.SimpleLogger internalWriteLog
FINE: [Thread-170] client(cn.leancloud.websocket.AVStandardWebSocketClient@1266e955) uplink : cmd: conv
op: start
peerId: "a3969"
i: -65485
convMessage {
m: "a100004531"
m: "healthInquiry"
m: "a3969"
unique: true
attr {
data: "{\"name\":\"a3969\u0026a100004531\u0026healthInquiry\",\"attr\":{\"alreadyTalk\":\"0\",\"orderNumber\":\"1011779499299277\",\"orderId\":2197,\"advisoryType\":\"1\",\"canTalk\":\"20000\",\"businessStatus\":\"2\"}}"
}
}

Feb 23, 2021 10:51:24 AM cn.leancloud.logging.SimpleLogger internalWriteLog
FINE: [Thread-165] client(cn.leancloud.websocket.AVStandardWebSocketClient@1266e955) downlink: cmd: conv
op: started
peerId: "a3969"
i: -65485
service: 2
convMessage {
cid: "603457a895211d5b7714f28d"
cdate: "2021-02-23T01:17:28.737Z"
uniqueId: "717e5e4727a7355dabef9d0cc75124e8"
existing: true
}

Feb 23, 2021 10:51:24 AM cn.leancloud.logging.SimpleLogger internalWriteLog
FINE: [Thread-165] new message arriving. peerId=a3969, requestId=-65485, command=1
Feb 23, 2021 10:51:24 AM cn.leancloud.logging.SimpleLogger internalWriteLog
FINE: [Thread-165] enter onOperationCompletedEx with clientId=a3969, convId=603457a895211d5b7714f28d, requestId=-65485, operation=CONVERSATION_CREATION, resultData={callbackconversation=603457a895211d5b7714f28d, callbackTemporaryTTL=0, callbackCreatedAt=2021-02-23T01:17:28.737Z, callbackUniqueId=717e5e4727a7355dabef9d0cc75124e8}
2021-02-23 10:51:24.873 [WebSocketConnectReadThread-165] INFO c.a.h.s.impl.ImLeanCloudServiceImpl - a3969&a100004531&healthInquiry创建会话!conversation=603457a895211d5b7714f28d;异常:null
2021-02-23 10:51:24.873 [WebSocketConnectReadThread-165] INFO c.a.h.s.impl.ImLeanCloudServiceImpl - a3969&a100004531&healthInquiry会话创建成功!
2021-02-23 10:51:24.874 [WebSocketConnectReadThread-165] INFO c.a.h.s.impl.ImLeanCloudServiceImpl - a3969发送消息!异常:cn.leancloud.im.v2.AVIMException: cn.leancloud.AVException: Connection lost

说一下代码的问题吧。
1. 每次调用 ImSendMessage 都会调用 initialized 和 buildConnection 吗?我们 SDK 的初始化和 startConnection 应该是在程序起来之后调用一次就可以了的,不能每次都调用。
2. IMClient 的操作在时序上应该严格保证是在 startConnection 成功之后再做调用,也就是说 ImSendMessage 这个函数的调用时机应该放到 startConnection 的回调里面,或者等 startConnection 回调触发一个信号量之后再做调用。

你把代码按照上面的建议改一下,应该就可以正常运行了。

按你的建议修改后,测试环境还是发送的时候发不出去,登录和创建会话都正常,就是发消息时提示Connection lost

你使用的 sdk 版本是多少?我们来提供一份 sample code 给你试试看。

我用的时7.2.1版本的,可以提供给我试一下看

你在应用设置的安全中心里面,是否开启了「推送服务」?

我本地在 sample 工程中出现过 connection lost 的错误,这是因为我没有开启「推送服务」,并且 startConnection 之后并没有立即去 open IMClient,导致服务端下发了一个指示 sdk 断开连接的通知,这之后 sendMessage 就会失败。我估计你也是同样的问题。

需要你在「应用设置 - 安全中心」那里,打开「推送服务」的开关。

好得,感谢!我先试试看