我正在写一个星号模块。当收到某个SIP请求时,我想等待直到触发某个条件,并且只有在它完成(最多5秒)之后,才允许Asterisk的核心功能进一步处理此请求。
我尝试创建一个pj_thread_t
,我的长时间运行的任务在其中运行,并且有一个循环以延迟(pj_thread_sleep
)运行多次,直到满足预期的条件。但是,这会阻止Asterisk中的所有SIP消息处理,而不仅仅是我正在处理的那个。
使用pj_thread_t
不是正确的方法吗?
我在原来的帖子里漏掉了一个细节。我在主线程中等待一个信号。当调用pj_thread_sleep
时,新线程实际上并没有阻塞。然而,问题仍然存在。我需要在新线程完成执行后从主线程返回PJ_FALSE
,以便其余模块可以在我完成后继续处理请求。
你不应该(我重复一遍,不应该)在核心处理线程中执行任何类似的线程逻辑。这将导致核心和逻辑出现非常难以捕捉的问题。您的RTP处理线程应该尽可能轻。
最好的选择是在星号之外,在外部逻辑中。使用AMI, ARI或FastAGI
如果你仍然想做一些背景检查,请参阅后台或阅读应用程序的源代码。另一个等待和相当复杂的例子是AMD应用程序。无论如何,它应该在应用程序中完成,而不是在RTP处理中完成。