Похоже, вы запускаете процесс Elasticsearch одновременно с запуском вашей программы, но Elasticsearch требует больше времени, чем ваша программа, чтобы быть готовой.
В этом случае вас может заинтересовать использование тех же абстракций , которые клиент NET использует для интеграционных тестов с Elasticsearch. Абстракции читают выходные данные процесса Elasticsearch, чтобы узнать, когда он будет готов, и блокировать, пока это не произойдет. Они доступны в фиде пакетов CI AppVeyor (с планами выпустить их в Nuget в будущем).
Есть несколько примеров того, как ускорить кластер с помощью абстракции . Для одного узла это будет что-то вроде
using System;
using Elastic.Managed.Configuration;
using Elastic.Managed.ConsoleWriters;
using Elastic.Managed.FileSystem;
namespace Elastic.Managed.Example
{
class Program
{
static void Main(string[] args)
{
var version = "7.5.1";
var esHome = Environment.ExpandEnvironmentVariables($@"%LOCALAPPDATA%\ElasticManaged\{version}\elasticsearch-{version}");
using (var node = new ElasticsearchNode(version, esHome))
{
node.SubscribeLines(new LineHighlightWriter());
if (!node.WaitForStarted(TimeSpan.FromMinutes(2))) throw new Exception();
// do your work here
}
}
}
}
Это предполагает, что zip-архив Elasticsearch 7.5.1 уже загружен и существует в %LOCALAPPDATA%\ElasticManaged\7.5.1\elasticsearch-7.5.1
. Есть более сложные примеры того, как интегрировать это в тесты с xUnit.
Вы можете использовать EphemeralCluster
компоненты для загрузки, настройки и запуска Elasticsearch
var plugins = new ElasticsearchPlugins(ElasticsearchPlugin.RepositoryAzure, ElasticsearchPlugin.IngestAttachment);
var config = new EphemeralClusterConfiguration("7.5.1", ClusterFeatures.XPack, plugins, numberOfNodes: 1);
using (var cluster = new EphemeralCluster(config))
{
cluster.Start();
var nodes = cluster.NodesUris();
var connectionPool = new StaticConnectionPool(nodes);
var settings = new ConnectionSettings(connectionPool).EnableDebugMode();
var client = new ElasticClient(settings);
Console.Write(client.CatPlugins().DebugInformation);
}