当我们使用RabbitMQ发布和订户模式时,如何调用另一个方法?
我有一个程序,需要处理来自两个源的事务,第一个来自RabbitMQ,另一个来自数据库。对于第一个,我使用RabbitMQ发布和订阅者模式,这样每当任何事务进入队列时,该方法都可以处理该事务,但发布和订阅者模式的问题是,它不能控制其他方法。若事务是从队列中处理的,那个么它正在等待新的事务。我知道这是这种模式的行为,但如果队列中没有事务,如何在这两者之间从数据库调用其他methodtransactions。有趣的东西。关于CPython的真相是,由于GIL,它本质上是单线程的。因此,当订阅者线程正在运行时(我猜您正在使用线程),订阅者实际上正在轮询新消息,因此总是很忙,因此它从不将控制权放弃给db线程。解决方案:切换到多处理模块,而不是线程。或者您可以交错轮询RabbitMQ和工作数据库线程 我已使用以下代码解决了此问题当我们使用RabbitMQ发布和订户模式时,如何调用另一个方法?,rabbitmq,publish-subscribe,Rabbitmq,Publish Subscribe,我有一个程序,需要处理来自两个源的事务,第一个来自RabbitMQ,另一个来自数据库。对于第一个,我使用RabbitMQ发布和订阅者模式,这样每当任何事务进入队列时,该方法都可以处理该事务,但发布和订阅者模式的问题是,它不能控制其他方法。若事务是从队列中处理的,那个么它正在等待新的事务。我知道这是这种模式的行为,但如果队列中没有事务,如何在这两者之间从数据库调用其他methodtransactions。有趣的东西。关于CPython的真相是,由于GIL,它本质上是单线程的。因此,当订阅者线程正在
private void Poll()
{
while (Enabled)
{
try
{
BasicDeliverEventArgs objBasicDeliverEventArgs;
//Get next message
var boolMessageRecieved = _subscription.Next(60000, out objBasicDeliverEventArgs);
//Deserialize message
if (boolMessageRecieved)
{
var objEvent = DeSerialize(objBasicDeliverEventArgs.Body);
if (objEvent != null)
{
registerService.Process(objEvent);
_subscription.Ack();
}
}
else
{
//DB realted process.
Console.WriteLine("Idle time because there is no messages in queue");
System.Threading.Thread.Sleep(60000);
}
}
catch (Exception)
{
//log
}
}
}