|  |  | 
 |  |  | import org.springframework.scheduling.annotation.Scheduled; | 
 |  |  | import org.springframework.stereotype.Component; | 
 |  |  |  | 
 |  |  | import javax.sip.*; | 
 |  |  | import javax.sip.DialogTerminatedEvent; | 
 |  |  | import javax.sip.ResponseEvent; | 
 |  |  | import javax.sip.TimeoutEvent; | 
 |  |  | import javax.sip.TransactionTerminatedEvent; | 
 |  |  | import javax.sip.header.CallIdHeader; | 
 |  |  | import javax.sip.message.Response; | 
 |  |  | import java.time.Instant; | 
 |  |  | 
 |  |  |     private Map<String, SipSubscribe.Event> okSubscribes = new ConcurrentHashMap<>(); | 
 |  |  |  | 
 |  |  |     private Map<String, Instant> okTimeSubscribes = new ConcurrentHashMap<>(); | 
 |  |  |  | 
 |  |  |     private Map<String, Instant> errorTimeSubscribes = new ConcurrentHashMap<>(); | 
 |  |  |  | 
 |  |  |     //    @Scheduled(cron="*/5 * * * * ?")   //每五秒执行一次 | 
 |  |  | 
 |  |  |         logger.debug("errorSubscribes.size:{}",errorSubscribes.size()); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public interface Event { | 
 |  |  |         void response(EventResult eventResult); | 
 |  |  |     public interface Event { void response(EventResult eventResult) ; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |         // 会话已结束 | 
 |  |  |         dialogTerminated, | 
 |  |  |         // 设备未找到 | 
 |  |  |         deviceNotFoundEvent | 
 |  |  |         deviceNotFoundEvent, | 
 |  |  |         // 设备未找到 | 
 |  |  |         cmdSendFailEvent | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static class EventResult<EventObject>{ | 
 |  |  | 
 |  |  |         public EventResultType type; | 
 |  |  |         public String msg; | 
 |  |  |         public String callId; | 
 |  |  |         public Dialog dialog; | 
 |  |  |         public EventObject event; | 
 |  |  |  | 
 |  |  |         public EventResult() { | 
 |  |  | 
 |  |  |             if (event instanceof ResponseEvent) { | 
 |  |  |                 ResponseEvent responseEvent = (ResponseEvent)event; | 
 |  |  |                 Response response = responseEvent.getResponse(); | 
 |  |  |                 this.dialog = responseEvent.getDialog(); | 
 |  |  |                 this.type = EventResultType.response; | 
 |  |  |                 if (response != null) { | 
 |  |  |                     this.msg = response.getReasonPhrase(); | 
 |  |  | 
 |  |  |                 this.statusCode = -1024; | 
 |  |  |                 this.callId = dialogTerminatedEvent.getDialog().getCallId().getCallId(); | 
 |  |  |             }else if (event instanceof DeviceNotFoundEvent) { | 
 |  |  |                 DeviceNotFoundEvent deviceNotFoundEvent = (DeviceNotFoundEvent)event; | 
 |  |  |                 this.type = EventResultType.deviceNotFoundEvent; | 
 |  |  |                 this.msg = "设备未找到"; | 
 |  |  |                 this.statusCode = -1024; | 
 |  |  |                 this.dialog = deviceNotFoundEvent.getDialog(); | 
 |  |  |                 this.callId = this.dialog != null ?deviceNotFoundEvent.getDialog().getCallId().getCallId() : null; | 
 |  |  |                 this.callId = ((DeviceNotFoundEvent) event).getCallId(); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } |