RabbitMQ - публикация в очереди или обмен

Здесь задействованы два разных персонажа. Один из них - MICRO SIGN , который находится на клавиатуре, а другой - GREEK SMALL LETTER MU .

Чтобы понять, что происходит, мы должны посмотреть, как Python определяет идентификаторы в справочнике языка :

identifier   ::=  xid_start xid_continue*
id_start     ::=  
id_continue  ::=  
xid_start    ::=  
xid_continue ::=  

Оба наших символа, MICRO SIGN и GREEK SMALL LETTER MU являются частью Ll unicode group (строчные буквы), поэтому оба они могут использоваться в любой позиции в идентификаторе. Теперь обратите внимание, что определение identifier на самом деле относится к xid_start и xid_continue, и они определены как все символы в соответствующем не-х определении, чья нормализация NFKC приводит к допустимой последовательности символов для идентификатора.

Очевидно, что Python заботится только о нормализованной форме идентификаторов . Это подтверждается немного ниже:

Все идентификаторы преобразуются в обычную форму NFKC во время разбора; сравнение идентификаторов основано на NFKC.

blockquote>

NFKC - это нормализация Юникода , которая разлагает символы на отдельные части. MICRO SIGN распадается на GREEK SMALL LETTER MU, и это именно то, что происходит там.

На эту нормализацию также влияет множество других символов. Другим примером является OHM SIGN , который распадается на GREEK CAPITAL LETTER OMEGA . Использование этого в качестве идентификатора дает аналогичный результат, здесь показано с использованием locals:

>>> Ω = 'bar'
>>> locals()['Ω']
Traceback (most recent call last):
  File "", line 1, in 
    locals()['Ω']
KeyError: 'Ω'
>>> [k for k, v in locals().items() if v == 'bar'][0].encode()
b'\xce\xa9'
>>> 'Ω'.encode()
b'\xe2\x84\xa6'

Итак, в конце концов, это именно то, что делает Python. К сожалению, на самом деле нет хорошего способа обнаружить это поведение, вызывая ошибки, такие как показанные. Обычно, когда идентификатор упоминается только как идентификатор, то есть он используется как реальная переменная или атрибут, тогда все будет нормально: нормализация выполняется каждый раз, и идентификатор найден.

Единственный проблема связана со строковым доступом. Строки - это просто строки, конечно, нормализации не происходит (это будет просто плохая идея). И два способа, показанные здесь, getattr и locals , оба действуют на словари. getattr() получает доступ к атрибуту объекта через __dict__ объекта, а locals() возвращает словарь. И в словарях клавишами может быть любая строка, поэтому вполне нормально иметь MICRO SIGN или OHM SIGN там.

В этих случаях вам нужно помнить о том, чтобы выполнить нормализацию самостоятельно. Для этого мы можем использовать unicodedata.normalize , что также позволяет нам правильно получить наше значение изнутри locals() (или используя getattr):

>>> normalized_ohm = unicodedata.normalize('NFKC', 'Ω')
>>> locals()[normalized_ohm]
'bar'

0
задан dhrm 15 January 2019 в 20:30
поделиться

1 ответ

Объявление очереди, публикация сообщений GenerateInvoice в очередь и наличие нескольких потребителей для очереди будет работать в этом сценарии.

Сообщения, опубликованные в очереди, не будут потеряны, и они останутся в RMQ, если нет потребителей. Единственное, что нужно сделать - это объявить очередь перед публикацией сообщений.

Пример Java:

channel.queueDeclare(QUEUE_NAME, false, false, false, null);

Затем, публикация может быть выполнена как:

channel.basicPublish("", QUEUE_NAME, null, message.getBytes());

, а потребление может быть сделано как:

channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
0
ответ дан DoIt 15 January 2019 в 20:30
поделиться
Другие вопросы по тегам:

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