diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java index 3b408ed6..a77b294b 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java @@ -47,6 +47,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; /** * SIP命令类型: ACK请求 @@ -193,19 +194,30 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In zlmPublishHookService.getHandler(sendRtpItem.getApp()).put(sendRtpItem.getStreamId(),()->{ taskExecutor.submit(()->{ JSONObject startSendRtpStreamResult; + AtomicReference failMag = new AtomicReference<>(""); Retryer retryer = RetryerBuilder.newBuilder() - .retryIfResult(resp -> resp == null || resp.getInteger("code") != 0) + .retryIfResult(resp -> { + if(resp != null && resp.getInteger("code") == -1){ + String msg = resp.getString("msg"); + if(!msg.equalsIgnoreCase(failMag.get())){ + failMag.set(msg); + logger.debug(msg); + } + } + return resp == null || resp.getInteger("code") != 0; + }) .retryIfException() .retryIfRuntimeException() // 重试间隔 .withWaitStrategy(WaitStrategies.fixedWait(1, TimeUnit.MILLISECONDS)) // 重试次数 - .withStopStrategy(StopStrategies.stopAfterAttempt(20 * 1000)) + .withStopStrategy(StopStrategies.stopAfterAttempt(15 * 1000)) .build(); try { startSendRtpStreamResult = retryer.call(() -> zlmServerFactory.startSendRtpStream(mediaInfo, param)); + logger.info("rtp转推成功 {} {} {}", channelId, mediaInfo, param); } catch (ExecutionException | RetryException e) { - logger.error("rtp转推失败 {}",e.getMessage()); + logger.error("rtp转推失败 {} {} {} {}", channelId, mediaInfo, param, e.getMessage()); startSendRtpStreamResult = null; } startSendRtpStreamHand(evt, sendRtpItem, parentPlatform, startSendRtpStreamResult, param, callIdHeader); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java index c8111e1d..c84e4c27 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java @@ -596,6 +596,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements sendRtpItem.setPlayType(InviteStreamType.DOWNLOAD); SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, null, null, device.isSsrcCheck(), true, 0, false, device.getStreamModeForParam()); sendRtpItem.setStreamId(ssrcInfo.getStream()); + sendRtpItem.setLocalPort(0); // 写入redis, 超时时回复 redisCatchStorage.updateSendRTPSever(sendRtpItem);