应用程序: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!");
}
答案 0 :(得分:0)
始终处理您在使用完毕后创建的关联。
否则可以从多个线程调用RabbitMQ.Client ConnectionFactory.CreateConnection()
,但返回的连接只能由创建它的线程使用,应该在使用后对其进行处理。 / p>