3

我在 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

4 回答 4

4

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

于 2012-05-23T19:16:13.073 回答
1

你可以使用它的包装器:

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

然后使用 Java Serializable Object 将此消息序列化为字节数组

或者您可以使用以下代码:

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

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

于 2012-05-23T10:10:33.330 回答
0

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

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

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

压缩后的数据流经过Base64处理后发送

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

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

于 2012-05-23T19:32:35.883 回答
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();
于 2015-06-17T16:48:11.123 回答