ServiceStack.RabbitMQServer线程安全吗?可以从任务开始吗?

时间:2018-02-09 18:53:55

标签: rabbitmq servicestack

应用程序:ServiceStack上的.NET WebServer,使用RabbitMQ通过类RabbitMQServer托管服务。

基础设施:WebServer和RabbitMQ位于不同的Docker容器中。

问题:在启动WebServer App期间,它必须使用RabbitMQServer.Start(),但连接失败,因为Rabbit尚未启动。

我想尝试检查连接到Rabbit的能力并在.NET任务中启动RabbitMQServer。 RabbitMQServer类线程安全吗?

我的代码:

    ...
    RabbitMQServer _rabbitMqServer = ...;
    ...  
    public void Start()
    {
        Task.Run(() => TryToStart());
    }

    private void TryToStart()
    {
        var tryIndex = 0;
        const int tryCount = 10;
        const int tryTimeoutStep = 3000;
        const int tryMaxTimeout = 30000;
        while (tryIndex < tryCount)
        {
            tryIndex++;
            try
            {
                _logger.Info("Próba połączenia z RabbitMQ ...");
                ((RabbitMqMessageFactory) _rabbitMqServer.MessageFactory).ConnectionFactory.CreateConnection();

                // nie ma BrokerUnreachableException
                _rabbitMqServer.Start();
                return;
            }
            catch (BrokerUnreachableException e)
            {
                var millisecondsTimeout = Math.Min(tryTimeoutStep * tryIndex, tryMaxTimeout);
                _logger.Error($"{e.Message} - czekam {millisecondsTimeout / 1000}s ...");
                Thread.Sleep(millisecondsTimeout);
            }
        }

        _logger.Error("Nie połączono z RabbitMQ!");
    }

1 个答案:

答案 0 :(得分:0)

始终处理您在使用完毕后创建的关联。

否则可以从多个线程调用RabbitMQ.Client ConnectionFactory.CreateConnection(),但返回的连接只能由创建它的线程使用,应该在使用后对其进行处理。 / p>