Этот вопрос похож на тот, который я написал о Postgre .
По сути, я настраиваю программу, которая использует клиент .NET Docker и запускает образ RabbitMQ (с плагином управления)включается), а затем через EasyNetQ использует RabbitMQ для подписки и отправки сообщения в той же очереди.
public static class Program
{
public static async Task Main(params string[] args)
{
var configurationBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
var configuration = new Configuration();
configurationBuilder.Build().Bind(configuration);
var client = new DockerClientConfiguration(DockerUris.DefaultLocalApi).CreateClient();
var containers = await client.Containers.SearchByNameAsync(configuration.ContainerName);
var container = containers.SingleOrDefault();
if (container != null)
{
await client.Containers.StopAndRemoveContainerAsync(container.ID);
await client.Volumes.RemoveAsync(container.Mounts.Select(x => x.Name));
}
var createdContainer = await client.Containers.RunContainerAsync(new CreateContainerParameters
{
Image = configuration.ImageName,
HostConfig = new HostConfig
{
PortBindings = new Dictionary<string, IList<PortBinding>>
{
{$"{configuration.QueueContainerPort}/{configuration.QueueContainerPortProtocol}",
new List<PortBinding>
{
new PortBinding { HostPort = configuration.QueueHostPort }
}
},
{$"{configuration.ManagementContainerPort}/{configuration.ManagementContainerPortProtocol}",
new List<PortBinding>
{
new PortBinding { HostPort = configuration.ManagementHostPort }
}
}
}
},
Env = new List<string>
{
$"RABBITMQ_DEFAULT_USER={configuration.Username}",
$"RABBITMQ_DEFAULT_PASS={configuration.Password}"
},
Name = configuration.ContainerName
});
// Thread.Sleep(2000);
var bus = RabbitHutch.CreateBus("host=localhost");
await bus.PubSub.SubscribeAsync<TextMessage>("sub", message =>
{
Console.WriteLine(message.Text);
});
await bus.PubSub.PublishAsync<TextMessage>(new TextMessage
{
Text = "Michelle"
});
Console.ReadKey();
}
}
public class TextMessage
{
public string Text { get; set; }
}
Кажется, что RabbitMQ не полностью готов к подписке, если я запускаю свою программу выше (то есть, если // Thread.Sleep(2000);
не закомментировано), я получаю следующее исключение:
System.TimeoutException: The operation requested on PersistentChannel timed out
at at EasyNetQ.Producer.PersistentChannel.InvokeChannelAction(Action`1 channelAction)
at at EasyNetQ.Producer.ClientCommandDispatcherSingleton.<>c__DisplayClass4_0`1.<InvokeAsync>b__0()
at at EasyNetQ.RabbitAdvancedBus.QueueDeclareAsync(String name, Action`1 configure, CancellationToken cancellationToken)
at at EasyNetQ.Producer.DefaultPubSub.SubscribeAsyncInternal[T](String subscriptionId, Func`3 onMessage, Action`1 configure, CancellationToken cancellationToken)
Мне интересно, какую команду я могу запустить в контейнере, чтобы знать, что RabbitMQ полностью готов кподписаться на.