Как синхронизировать клиентскую транзакцию сервлета?
Здравствуйте, я в настоящее время использую restcomm-sip-servlets-4.0.75-apache-tomcat-8.0.26. и у меня возникают проблемы при отмене текущего запроса из потока http-запросов. Я заметил, что эта проблема возникает только тогда, когда я создаю новый запрос с заголовком аутентификации следующим образом:
AuthInfo authInfo = sipFactory.createAuthInfo();
authInfo.addAuthInfo(
response.getStatus(),
realm,myauth,password);
SipServletRequest challengeRequest = response.getSession().createRequest(
response.getRequest().getMethod());
(String)session.getAttribute("FirstPartyContent");
if(session.getAttribute("FirstPartyContent") !=null){
challengeRequest.setContent(session.getAttribute("FirstPartyContent"),(String) session.getAttribute("FirstPartyContentType"));
}
challengeRequest.addAuthHeader(response, authInfo);
challengeRequest.getFrom().setDisplayName(auth.getDisplayName());
session.removeAttribute("original");
session.setAttribute("original", challengeRequest);
challengeRequest.send();
Когда запрос приходит через интерфейс http, я ищу SipApplicationSession примерно так:
SipSessionsUtil sipSessionsUtil =
(SipSessionsUtil) session.getServletContext().
getAttribute("javax.servlet.sip.SipSessionsUtil");
logger.info("found servlet contxt for sipsession util");
SipApplicationSession tobecancelledsess = sipSessionsUtil.getApplicationSessionById(sessionapplicationID);
Затем я создаю запрос отмены из запроса сеанса, который хранится примерно так:
SipServletRequest req = (SipServletRequest) tobecancelledsess.getAttribute ("оригинал"); drequest = req.createCancel();
хотя удаленный сервер отвечает временным с to-tag я получаю:
2017-04-28 16:26:04,470 DEBUG [SipServletMessageImpl] (http-bio-8443-exec-1) транзакция пустая транзакция Id = пустая транзакцияТип ложный 2017-04-28 16:26:04,470 DEBUG [SipServletMessageImpl] (http-био -8443-exec-1) транзакция пустая транзакция Id = пустая транзакцияТип ложный java.lang.IllegalStateException: клиентская транзакция не найдена! null at org.mobicents.servlet.sip.message.SipServletRequestImpl.createCancel(SipServletRequestImpl.java:258) в org.example.servlet.sip.CallContainer.CancelSession(CallContainer.java:31ample.sserv.java:319.sserv...s.CallContainer.CheckCancel(CallContainer.java:274) в org.example.servlet.sip.SimpleWebServlet.doPut(SimpleWebServlet.java:360) в org.example.servlet.sip.SimpleWebServlet.service(SimpleWebServlet) jj.servlet.http.HttpServlet.:206) в org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) в org.ap.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) в org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) по адресу org.mobicents.servlet.sip.startup.SipStandardContextValve.invoke(SipStandardContextValve.java:262) по адресу org.apache.catalina.authenticator.AuthenticatorBase.ntic_base.at.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) в org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) в org.apache.catalina.valves.VkeveAveLLive.java:616) в org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) в org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) в org.apache.coote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) в org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) в org.apache.tomcat.util.net.JIoEndpointr. SocketProcess. Java:279) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) в org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) в java.lang.Thread.run(Thread.java:745)
Я заметил, что когда я отменяю запрос из класса сервлетов, у меня нет этой проблемы.
1 ответ
Я обнаружил, что установка атрибута context в ответе, как этот, решает мою проблему:
if (resp.getStatus() == SipServletResponse.SC_RINGING){
SipSession session = resp.getSession();
resp.getSession().getServletContext().setAttribute("ringing",true);
}
Затем я беру контекст сеанса, как это
SipServletRequest req = (SipServletRequest)tobecancelledsess.getAttribute("original");
Boolean ringed = (Boolean ) tobecancelledsess.getServletContext().getAttribute("ringing");
if(ringed == Boolean.True)
drequest = req.createCancel();
и в конце концов вам нужно отправить запрос на отмену с помощью send();