我在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中设置任何参数吗?
答案 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();