Этот API, над которым я работаю (. NET Core 2.1), используется в пакетном процессе. Конечная точка, вызываемая в этом рабочем процессе, представляет собой сообщение, которое принимает int из маршрута и вызывает метод из класса обслуживания.
[HttpPost("region/model/{propertyNum:int}"), SecurableAction("RegionModel")]
public IActionResult AddModelMessageRequest(int propertyNum)
{
return _svc.BatchService.RequestModel(propertyNum).ToResult();
}
Все, что делает этот метод, - это помещает сообщение в очередь rabbitMQ для использования другое развертывание на том же сервере. Вы увидите, что к ответу Api ничего не добавлено. Вся цель этой очереди - выгрузить лог c, выполненный потребителем-кроликом, из пакетного процесса.
public IApiResponse RequestModel(int propertyValue)
{
var response = new ApiResponse();
try
{
var startCmd = new RequestModelMessage
{
PropertyName = propertyValue
};
_rabbitRepo.SendModelRequest(startCmd);
return response;
}
catch (Exception ex)
{
response.AddError(Globals.Messages.GeneralError).Catch(ex);
var log = _logger.Error.Catch(ex).Write();
response.CorrelationID = log.UUID;
return response;
}
}
Это код, который помещает сообщение кролика в очередь:
public void SendModelRequest(RequestModelMessage msg)
{
SendMessage(QBuilder.ExchangeName, QConfig.Wcx.Keys.ToModelQ, msg);
}
public void SendMessage(string exchange, string routeKey, object message)
{
_channel.BasicPublish(exchange: exchange,
routingKey: routeKey,
mandatory: false,
body: Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)));
}
Вначале go все вроде нормально. Сообщения добавляются в очередь, потребитель-кролик потребляет сообщения и выполняет логические c и sql вставки, для которых он предназначен. Когда я дохожу до 4000-го запроса или около того, API просто отключается. API больше не отправляет сообщения в очередь кроликов. Не существует специального c ограничения, по которому сама очередь кроликов попадает, в очереди кроликов может быть от 250 до 1000 сообщений, когда это происходит, но это всегда примерно 4000-й вызов API для указанного выше сообщения.
Развертывание, которое использует сообщения (которое находится на том же сервере, что и API), продолжает работать нормально. Он продолжает обрабатывать очередь после того, как API прекратил добавлять сообщения в очередь. API и потребитель очереди совместно используют проекты классов обслуживания. Если я перезапущу API, пока внешний пакетный процесс все еще запущен, API возобновит добавление сообщений в очередь, причем пакетный процесс, по сути, просто пропустит этап вызова API (или он не ждет, какой ответ от API есть) для элементов, которые он обработал, пока API не работает.
Кто-нибудь видит здесь что-нибудь, что могло бы заставить меня уничтожить память API? Или по любой другой причине он будет продолжать отключаться после повторения-i sh количества вызовов, полученных на эту конечную точку?
Спасибо за ваше время.