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);  

ご覧のとおり、私のメッセージのいくつかは魔女に沿って圧縮する必要があり、他のメッセージは圧縮しないでください。
「ねえ!これはzip形式のメッセージです」と消費者に伝えるためのプロパティを設定する方法はありますか?

PS。「com.rabbitmq.client.AMQP.BasicProperties.BasicProperties(...、マップヘッダー、...)」は役に立ちますか?つまり、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 to Byte Arrayでシリアライズします

または、次のコードを使用できます。

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 に答える