Обнаружение отключения RabbitMQ в Java Client [дубликат]

new_list = my_list[:]

new_list = my_list Попытайтесь это понять. Предположим, что my_list находится в памяти кучи в месте X, то есть my_list указывает на X. Теперь, назначив new_list = my_list, вы даете new_list указывать на X. Это называется мелкой копией.

Теперь, если вы назначили new_list = my_list[:], вы просто копируете каждый объект my_list в new_list. Это известно как Deep copy.

Другой способ, которым вы можете это сделать:

  • new_list = list(old_list)
  • import copy new_list = copy.deepcopy(old_list)
9
задан Gates VP 27 September 2014 в 03:25
поделиться

2 ответа

Я предполагаю, что вы используете библиотеку c #? (но, тем не менее, я думаю, что другие имеют аналогичное событие).

Вы можете сделать следующее:

public class MyRabbitConsumer
{
  private IConnection connection;

  public void Connect()
  {
    connection = CreateAndOpenConnection();
    connection.ConnectionShutdown += connection_ConnectionShutdown;
  }

  public IConnection CreateAndOpenConnection() { ... }

  private void connection_ConnectionShutdown(IConnection connection, ShutdownEventArgs reason)
  {

  }
}
5
ответ дан kzhen 19 August 2018 в 14:40
поделиться

Это пример этого, но заметный ответ - вот что привело меня к этому.

var factory = new ConnectionFactory
{
    HostName = "MY_HOST_NAME",
    UserName = "USERNAME",
    Password = "PASSWORD",
    RequestedHeartbeat = 30
};

using (var connection = factory.CreateConnection())
{
    connection.ConnectionShutdown += (o, e) =>
    {                       
        //handle disconnect                            
    };

    using (var model = connection.CreateModel())
    {
        model.ExchangeDeclare(EXCHANGE_NAME, "topic");
        var queueName = model.QueueDeclare();

        model.QueueBind(queueName, EXCHANGE_NAME, "#"); 

        var consumer = new QueueingBasicConsumer(model);
        model.BasicConsume(queueName, true, consumer);

        while (!stop)
        {
            BasicDeliverEventArgs args;                       
            consumer.Queue.Dequeue(5000, out args);

            if (stop) return;

            if (args == null) continue;
            if (args.Body.Length == 0) continue;

            Task.Factory.StartNew(() =>
            {
                //Do work here on different thread then this one
            }, TaskCreationOptions.PreferFairness);
        }
    }
}

Несколько замечаний об этом.

Я использую # для темы. Это захватывает все. Обычно вы хотите ограничить тему.

Я устанавливаю переменную с именем «stop», чтобы определить, когда процесс должен завершиться. Вы заметите, что цикл работает вечно до тех пор, пока эта переменная не будет истинна.

Dequeue ждет 5 секунд, а затем выходит без получения данных, если нет нового сообщения. Это делается для того, чтобы мы прослушивали эту стоп-переменную и фактически уходили в какой-то момент. Измените значение по своему вкусу.

Когда приходит сообщение, я создаю код обработки в новом потоке. Текущий поток резервируется только для прослушивания сообщений rabbitmq, и если обработчик занимает слишком много времени для обработки, я не хочу, чтобы он замедлял другие сообщения. Это может потребоваться или не понадобиться в зависимости от вашей реализации. Однако будьте осторожны с написанием кода для обработки сообщений. Если вам понадобится минута, и вы получаете сообщения в суб-второй раз, у вас не хватит памяти или, по крайней мере, на серьезные проблемы с производительностью.

0
ответ дан Kelly 19 August 2018 в 14:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: