当我们使用RabbitMQ发布和订户模式时,如何调用另一个方法?

当我们使用RabbitMQ发布和订户模式时,如何调用另一个方法?,rabbitmq,publish-subscribe,Rabbitmq,Publish Subscribe,我有一个程序,需要处理来自两个源的事务,第一个来自RabbitMQ,另一个来自数据库。对于第一个,我使用RabbitMQ发布和订阅者模式,这样每当任何事务进入队列时,该方法都可以处理该事务,但发布和订阅者模式的问题是,它不能控制其他方法。若事务是从队列中处理的,那个么它正在等待新的事务。我知道这是这种模式的行为,但如果队列中没有事务,如何在这两者之间从数据库调用其他methodtransactions。有趣的东西。关于CPython的真相是,由于GIL,它本质上是单线程的。因此,当订阅者线程正在

我有一个程序,需要处理来自两个源的事务,第一个来自RabbitMQ,另一个来自数据库。对于第一个,我使用RabbitMQ发布和订阅者模式,这样每当任何事务进入队列时,该方法都可以处理该事务,但发布和订阅者模式的问题是,它不能控制其他方法。若事务是从队列中处理的,那个么它正在等待新的事务。我知道这是这种模式的行为,但如果队列中没有事务,如何在这两者之间从数据库调用其他methodtransactions。

有趣的东西。关于CPython的真相是,由于GIL,它本质上是单线程的。因此,当订阅者线程正在运行时(我猜您正在使用线程),订阅者实际上正在轮询新消息,因此总是很忙,因此它从不将控制权放弃给db线程。解决方案:切换到多处理模块,而不是线程。或者您可以交错轮询RabbitMQ和工作数据库线程

我已使用以下代码解决了此问题

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
            }
        }
    }