Я разрабатываю очень простое приложение с помощью RabbitMQ. Одна машина, несколько очередей и обменов, один издатель и один потребитель. Прочитав дальше о Кластеризация и HA, я подключаю вторую машину для создания кластера, кроме того, я зеркалировал очереди, чтобы иметь хотя бы одну реплику. Теперь, когда я хочу опубликовать некоторые данные в очереди, я использую первую машину в качестве хоста, и она работает нормально, но если служба RabbitMQ первой машины, на которой не запущено мое приложение, вылетела из строя.
Мой вопрос: как узнать, на каком компьютере установлено соединение, и как изменить хост при публикации сообщений?
ОБНОВИТЬ
Я использую одну из перегрузок CreateConnection, чтобы передать все мои хосты для создания соединения. Хорошо, это решит проблему поиска доступной машины для создания соединения. Но второй вопрос все еще существует, посмотрите на код ниже:
for(int i = 0, i < 300, i++){
var message = string.Format("Message #{0}: {1}", i, Guid.NewGuid());
var messageBodyTypes = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(ExchangeName, "123456", null, messageBodyBytes);
}
Эти строки кода работают идеально, когда соединение в порядке, но предположим, что в середине публикации сообщений для обмена служба неожиданно остановилась, тогда в этом случае сначала поднялся System.IO.FileLoadException, и если я продолжу выполнение, поднятый RabbitMQ.Client.Exceptions.AlreadyClosedException, который говорит:
Already closed: The AMQP operation was interrupted: AMQP close-reason, initiated by Peer, code=320, text = "CONNECTION_FORCED - broker forced connection closure with reason 'shutdown'", classId=0, methidId=0, cause=
Я думаю, должен быть способ изменить хост при закрытии соединения во время публикации сообщений, но как, никакой ИДЕИ!





These lines of code is work perfect when the connection is OK, but assume that in the middle of publishing messages to an exchange, the service stopped unexpectedly, then in this case first System.IO.FileLoadException raised and if I continue the executation RabbitMQ.Client.Exceptions.AlreadyClosedException raised which is saying:
Вы должны закрыть канал и текущее соединение и открывать новое в каждом промежуточном цикле. Это должно использовать другое соединение. Это нужно делать только при обнаружении исключения, а не на каждой итерации цикла.
NOTE: the RabbitMQ team monitors the rabbitmq-users mailing list and only sometimes answers questions on StackOverflow.
Нет, я имею в виду, что когда вы поймаете
AlreadyClosedException, вы должны закрыть текущий канал и соединение и заново открыть новое соединение и канал из фабрики соединений. Это нужно делать только при возникновении исключения.