|
@@ -1318,15 +1318,18 @@ public class CallApi extends MsgHandlerBase {
|
|
|
gatewayConfig.getGatewayAddr(),
|
|
gatewayConfig.getGatewayAddr(),
|
|
|
gatewayConfig.getGwName());
|
|
gatewayConfig.getGwName());
|
|
|
|
|
|
|
|
|
|
+ // 先把网关引用挂到 customerChannel 上,保证后续任何失败路径都能通过 listener.releaseGateway() 归还许可;
|
|
|
|
|
+ customerChannel.setGatewayConfig(gatewayConfig);
|
|
|
String originationStr = genCallPhoneString(gatewayConfig, projectId, caseNo, uuidInner,
|
|
String originationStr = genCallPhoneString(gatewayConfig, projectId, caseNo, uuidInner,
|
|
|
uuidOuter, phone, callType, videoLevel);
|
|
uuidOuter, phone, callType, videoLevel);
|
|
|
- customerChannel.setGatewayConfig(gatewayConfig);
|
|
|
|
|
// 反向注册 Contact 解析失败时 dialstring 为空,换下一网关重试
|
|
// 反向注册 Contact 解析失败时 dialstring 为空,换下一网关重试
|
|
|
if(StringUtils.isNullOrEmpty(originationStr)){
|
|
if(StringUtils.isNullOrEmpty(originationStr)){
|
|
|
logger.warn("{} 软电话外呼 dialstring 为空(多为 register=2 Contact 未找到),跳过 originate,标记网关已尝试:uuid={}, register={}",
|
|
logger.warn("{} 软电话外呼 dialstring 为空(多为 register=2 Contact 未找到),跳过 originate,标记网关已尝试:uuid={}, register={}",
|
|
|
getTraceId(), gatewayConfig.getUuid(), gatewayConfig.getRegister());
|
|
getTraceId(), gatewayConfig.getUuid(), gatewayConfig.getRegister());
|
|
|
triedList.add(gatewayConfig);
|
|
triedList.add(gatewayConfig);
|
|
|
- SipGatewayLoadBalance.releaseGateway(gatewayConfig);
|
|
|
|
|
|
|
+ // 统一走 listener.releaseGateway() 归还:释放后会把 customerChannel 上的网关引用置 null,
|
|
|
|
|
+ // 避免后续 CHANNEL_HANGUP 事件对同一许可重复释放;
|
|
|
|
|
+ listener.releaseGateway();
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1350,6 +1353,9 @@ public class CallApi extends MsgHandlerBase {
|
|
|
logger.warn("{} 软电话外呼 originate 失败:uuid={}, register={}, sipCode={},加入 triedList",
|
|
logger.warn("{} 软电话外呼 originate 失败:uuid={}, register={}, sipCode={},加入 triedList",
|
|
|
getTraceId(), gatewayConfig.getUuid(), gatewayConfig.getRegister(),
|
|
getTraceId(), gatewayConfig.getUuid(), gatewayConfig.getRegister(),
|
|
|
customerChannel.getHangupSipCode());
|
|
customerChannel.getHangupSipCode());
|
|
|
|
|
+ // 切换下一个网关前先归还当前网关许可,防止 setGatewayConfig 覆盖引用后许可永久丢失;
|
|
|
|
|
+ // 若 CHANNEL_HANGUP 或 BACKGROUND_JOB 失败分支已释放过,releaseGateway 内部判空后不会重复释放;
|
|
|
|
|
+ listener.releaseGateway();
|
|
|
triedList.add(gatewayConfig);
|
|
triedList.add(gatewayConfig);
|
|
|
} else {
|
|
} else {
|
|
|
logger.info("{} 软电话外呼 originate 成功:uuid={}, register={}, 已尝试网关数={}",
|
|
logger.info("{} 软电话外呼 originate 成功:uuid={}, register={}, 已尝试网关数={}",
|