RabbitMQ消息属性

时间:2012-05-23 09:25:06

标签: java 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(...,Map headers,...)”帮助我吗?我的意思是我可以在BasicProperties.header中设置任何参数吗?

4 个答案:

答案 0 :(得分:4)

我想你可以在标题中添加任何你喜欢的东西。但是,有一个名为“contentEncoding”的字段,我认为这种情况更好。您可以在此字段中输入“gzip”,“deflate”或压缩算法,请查看此页面以了解为HTTP定义的编码:http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5

答案 1 :(得分:1)

您可以使用包装器作为:

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

然后用。序列化此消息 Java Serializable Object to Byte Array

或者您可以使用此代码:

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

并将适当的过滤器放在标题中。

答案 2 :(得分:0)

对于我正在使用RabbitMQ的项目,我们使用标题字段来标识内容类型和内容编码

例如,队列中的纯文本消息将读取

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

压缩数据流通过Base64处理,然后发送

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

RabbitMQ没有标准化的机制来识别内容类型和编码,您可以采用自己的方式或选择常用的标准。

答案 3 :(得分: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();