如何同步Servlet客户端事务?
How to synchronize Servlet client transaction?
您好,我目前使用的是 restcomm-sip-servlets-4.0.75-apache-tomcat-8.0.26。我在取消来自 http 请求线程的正在进行的请求时遇到问题。我注意到这个问题似乎只有在我创建一个带有 auth header 的新请求时才会发生,如下所示:
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);
然后我从像这样存储的 session 请求中创建一个取消请求:
SipServletRequest 请求 = (SipServletRequest)tobecancelledsess.getAttribute("original");
drequest = req.createCancel();
尽管远程服务器用 to-tag 临时响应,但我得到:
2017-04-28 16:26:04,470 DEBUG [SipServletMessageImpl] (http-bio-8443-exec-1) 事务 null transactionId = null transactionType false
2017-04-28 16:26:04,470 DEBUG [SipServletMessageImpl] (http-bio-8443-exec-1) 事务 null transactionId = null transactionType false
java.lang.IllegalStateException: 未找到客户交易!无效的
在 org.mobicents.servlet.sip.message.SipServletRequestImpl.createCancel(SipServletRequestImpl.java:258)
在 org.example.servlet.sip.CallContainer.CancelSession(CallContainer.java:319)
在 org.example.servlet.sip.CallContainer.CheckCancel(CallContainer.java:274)
在 org.example.servlet.sip.SimpleWebServlet.doPut(SimpleWebServlet.java:360)
在 org.example.servlet.sip.SimpleWebServlet.service(SimpleWebServlet.java:149)
在 javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
在 org.apache.catalina.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.invoke(AuthenticatorBase.java:502)
在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.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)
我注意到当我从 servlet 取消请求时 class 我没有遇到这个问题。
我发现像这样在响应中设置上下文属性可以解决我的问题:
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() 发送取消请求;
您好,我目前使用的是 restcomm-sip-servlets-4.0.75-apache-tomcat-8.0.26。我在取消来自 http 请求线程的正在进行的请求时遇到问题。我注意到这个问题似乎只有在我创建一个带有 auth header 的新请求时才会发生,如下所示:
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);
然后我从像这样存储的 session 请求中创建一个取消请求:
SipServletRequest 请求 = (SipServletRequest)tobecancelledsess.getAttribute("original"); drequest = req.createCancel();
尽管远程服务器用 to-tag 临时响应,但我得到:
2017-04-28 16:26:04,470 DEBUG [SipServletMessageImpl] (http-bio-8443-exec-1) 事务 null transactionId = null transactionType false 2017-04-28 16:26:04,470 DEBUG [SipServletMessageImpl] (http-bio-8443-exec-1) 事务 null transactionId = null transactionType false java.lang.IllegalStateException: 未找到客户交易!无效的 在 org.mobicents.servlet.sip.message.SipServletRequestImpl.createCancel(SipServletRequestImpl.java:258) 在 org.example.servlet.sip.CallContainer.CancelSession(CallContainer.java:319) 在 org.example.servlet.sip.CallContainer.CheckCancel(CallContainer.java:274) 在 org.example.servlet.sip.SimpleWebServlet.doPut(SimpleWebServlet.java:360) 在 org.example.servlet.sip.SimpleWebServlet.service(SimpleWebServlet.java:149) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 在 org.apache.catalina.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.invoke(AuthenticatorBase.java:502) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.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)
我注意到当我从 servlet 取消请求时 class 我没有遇到这个问题。
我发现像这样在响应中设置上下文属性可以解决我的问题:
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() 发送取消请求;