1

我们有一个针对 Mobicents SIP Servlets 编写的应用程序,目前使用的是 v2.1.547,但我也针对 v3.1.633 进行了测试,并注意到了相同的行为。

我们的应用程序作为 B2BUA 工作,我们有一个传入的 SIP 呼叫,我们还有一个出站 SIP 呼叫被放置到正在执行 VXML 的 MRF。这两个 SIP 调用与单个 SipApplicationSession 相关联——这是我们配置的并发模型。

100% 的时间重新创建的场景如下:

  • 向我们的应用程序发出的呼入电话(未接听电话)
  • 拨打 MRF 的呼出电话
  • 呼入电话挂断
  • 应用程序尝试终止与出站呼叫关联的 SipSession

我看到这个被记录:

2015-12-17 09:53:56,771 WARN [SipApplicationSessionImpl] (MSS-Executor-Thread-14) 无法获取会话信号量 java.util.concurrent.Semaphore@55fcc0cb[Permits = 0] 30 秒。无论如何,我们都会解锁信号量,因为事务即将超时。这也可能是并发控制风险。应用会话 is5faf5a3a-6a83-4f23-a30a-57d3eff3281c;SipController

我愿意相信我们的应用程序可能会以某种方式触发这种行为,但我目前不知道如何。我会认为获取/释放信号量都是实现内部的,所以它应该确保某些东西不会获取信号量并且永远不会释放它?

任何有关如何深入了解这一点的指针都将不胜感激,因为我说过它是 100% 可重复的,因此获取日志等都是可能的。

4

1 回答 1

0

如果不查看有关您如何访问和安排要发送的消息的任何日志或应用程序代码,很难判断。但是,如果您以异步方式使用相同的 SipApplicationSession,您可能希望使用我们供应商特定的异步 API https://mobicents.ci.cloudbees.com/job/MobicentsSipServlets-Release/lastSuccessfulBuild/artifact/documentation/jsr289-extensions-apidocs /org/mobicents/javax/servlet/sip/SipSessionsUtilExt.html#scheduleAsynchronousWork(java.lang.String,%20org.mobicents.javax.servlet.sip.SipApplicationSessionAsynchronousWork)这将保证对 SipapplicationSession 的访问是序列化的并避免任何并发问题。

于 2015-12-23T13:03:46.097 回答