2012-05-23 2 views
2

У меня есть код, как это в RabbitMQ:RabbitMQ Свойства сообщений

byte[] rawBytes = serialize(trxEntities);  
byte[] zipped = rawBytes; 
if (shouldBeCompress) { 
zipped = compressor.compress(rawBytes); 
} 
BasicProperties persistentBasic = MessageProperties.PERSISTENT_BASIC; 
channel.basicPublish("", queueName, persistentBasic, zipped); 

Как вы видите, некоторые из моих сообщений должны быть сжать вместе ведьмой некоторые другие не должны.
Можно ли каким-либо образом задать любые свойства, чтобы сообщить потребителю, что «эй! Это зашифрованное сообщение»?

PS. «com.rabbitmq.client.AMQP.BasicProperties.BasicProperties (..., заголовки карт, ...)« помогите мне? Я имею в виду, могу ли я установить любой параметр в BasicProperties.header?

ответ

1

можно использовать обертку для него, как:

public class wrapper(){ 
    public boolean isZipped; 
    public String serializedMessage; 
} 

и затем сериализовать это сообщение с Java Serializable Object to Byte Array

или вы можете использовать этот код:

persistentBasic = persistentBasic.builder().headers(filter).build(); 

и поставить соответствующий фильтровать в заголовке.

3

Я думаю, вы можете добавить что-нибудь, что вам нравится в заголовке. Тем не менее, есть поле под названием «contentEncoding», которое, я думаю, лучше для этой ситуации. Вы можете просто поместить «gzip», «deflate» или алгоритм сжатия в этом поле, посмотрите эту страницу для кодировки, определенной для HTTP: http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5

0

Для проекта, в котором я работаю, который использует RabbitMQ, мы использовать поле заголовка, чтобы определить тип содержимого и Content-Encoding

Например, обычный текст сообщения в очереди будет читать

{'type' : 'plaintext', 'encoding' : 'utf-8'}

Прессованные потоки данных обрабатываются через Base64, а затем отправлены

{'type' : 'gzip', 'encoding' : 'base64'}

Существует не стандартизированный механизм с RabbitMQ определить тип содержимого и кодировку, вы можете принять самостоятельно или выбрать часто используемый стандарт.

+0

Не следует ввести и кодирования быть подобно тому, как он используется более широко? т.е. http://stackoverflow.com/a/23600787/98069 – wbyoung

0

Да, вы можете!

Мы используем type поле для указания того, что сообщение было отправлено (например, USER_INFO, HEARTBEAT и др.) И contentEncoding поле для указания сжатия (если таковые имеются):

AMQP.BasicProperties.Builder propsBuilder = new AMQP.BasicProperties.Builder(); 
propsBuilder.type(typeName); 
if (compress) 
{ 
    propsBuilder.contentEncoding("zip"); 
} 
BasicProperties props = propsBuilder.build(); 
channel.basicPublish(targetExchange, "", true, props, data); 

// and receiving works like this: 
Delivery delivery = consumer.nextDelivery(); 
byte[] data = delivery.getBody(); 
BasicProperties props = delivery.getProperties(); 
String typeName = props.getType(); 
String replyToServerId = props.getReplyTo(); 
String contentEncoding = props.getContentEncoding(); 
Смежные вопросы