Can you publish a message while processing a queue in RabbitMQ .Net Client?

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-25 04:18:12

问题


I have a couple messaging scenarios I need help with using RabbitMQ 2.1.0 in c#... 1) I would like to have a subscriber listening to "raw" queue; then do some preprocessing and publish a new message, such as "preprocessed" to the same exchange. 2) similar to 1 but publish to a different exchange

I noticed in the .Net Client User Guide that it says do not call .basicPublish during a callback as it blocks threads.

using (IConnection conn = connectionFactory.CreateConnection())
{
    using (IModel model = conn.CreateModel())
    {
        var sub = new Subscription(model, "rtls");
        foreach (BasicDeliverEventArgs iter in sub)
        {
            var message = System.Text.Encoding.UTF8.GetString(iter.Body);
            //do stuff and build up a new message
            //possibly create a new connection?
            //  ***.BasicPublish(new message);

            sub.Ack(iter);
        }

    }
}

I would like to successfully process and publish the new message before I send the ack() on the original message; just so I'm sure every message is processed.

Is this the proper way to process or will it cause threading issues?

Thank you for your help!


回答1:


What you say about callbacks is true, but it only applies if you're subclassing DefaultBasicConsumer (or writing your own consumer from scratch).

In your case, Subscription is the consumer and it shouldn't cause any locks by itself. The code you have is fine, since it only uses the Subscription consumer. It should be safe to BasicPublish at that point.

Your code also happens to be (more or less) our Subscriber example.

Also, sorry for not answering on rabbitmq-discuss.



来源:https://stackoverflow.com/questions/3972756/can-you-publish-a-message-while-processing-a-queue-in-rabbitmq-net-client

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!