Compression MQ-队列上的数据压缩

Compression MQ-队列上的数据压缩,compression,jms,ibm-mq,Compression,Jms,Ibm Mq,问题:MQ7具有最大100MB jms消息的硬限制。对于接近的大型有效负载(xml),是否可以在队列上进行压缩以缩短数据长度 我尝试在svr.def.conn通道上使用MQ ZLIB压缩来压缩7MB jms字符串消息,但对jms消息的数据长度没有任何影响。我只设置了一个通道,并期望使用的通道将压缩进入队列的数据 MQ服务器:7.5 客户机:JAVA 消息类型:字符串通道级压缩用于压缩通道两端之间传输的数据,在您的情况下是在JMS客户端和MQ SVRCONN通道之间传输的数据。消息本身在通过网络传

问题:MQ7具有最大100MB jms消息的硬限制。对于接近的大型有效负载(xml),是否可以在队列上进行压缩以缩短数据长度

我尝试在svr.def.conn通道上使用MQ ZLIB压缩来压缩7MB jms字符串消息,但对jms消息的数据长度没有任何影响。我只设置了一个通道,并期望使用的通道将压缩进入队列的数据

MQ服务器:7.5 客户机:JAVA
消息类型:字符串

通道级压缩用于压缩通道两端之间传输的数据,在您的情况下是在JMS客户端和MQ SVRCONN通道之间传输的数据。消息本身在通过网络传输时会被压缩,但在队列中不会被压缩。

我建议您按下有效负载并使用压缩包。消息属性可用于限定有效负载类型,类似于HTTP,例如“内容编码”、“内容类型”

以下是compressGZIP方法:

private byte[] compressGZIP(String string, Charset charset) throws IOException {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    try (GZIPOutputStream out = new GZIPOutputStream(byteArrayOutputStream)) {
        StringReader stringReader = new StringReader(string);
        // IOUtils from apache commons-io
        IOUtils.copy(stringReader, out, charset);
    }
    return byteArrayOutputStream.toByteArray();
}
然后,消费者可以请求消息属性,根据“内容编码”和“内容类型”消息属性解压缩并重新创建xml

像这样的

public void onMessage(Message message) {
    BytesMessage bytesMessage = (BytesMessage) message;

    long bodyLength = bytesMessage.getBodyLength();
    byte[] rawPayload = new byte[(int) bodyLength];
    InputStream payloadInputStream = new ByteArrayInputStream(rawPayload);

    String contentEncoding = bytesMessage.getStringProperty("Content-Encoding");
    if("gzip".equals(contentEncoding)) {
        payloadInputStream = new GZIPInputStream(payloadInputStream);
    }

    String contentType = bytesMessage.getStringProperty("Content-Type");
    MimeType mimeType = new MimeType(contentType); // from javax.activation

    if("text".equals(mimeType.getPrimaryType())) {
        if("xml".equals(mimeType.getSubType())) {
            Charset charset;

            String charsetString = mimeType.getParameter("charset");
            if(charsetString != null) {
                charset = Charset.forName(charsetString);
            } else {
                charset = StandardCharsets.UTF_8; // default
            }

            Reader reader = new InputStreamReader(payloadInputStream, charset);

            String xml = IOUtils.toString(reader);
            IOUtils.closeQuietly(reader);
        }
    }
}
此解决方案的优点是,您可以使用标准JMS api,而不是使用特定于提供程序的配置

缺点是发送方和接收方必须实现内容类型处理


因此,您必须在可移植性和实现工作之间做出决定。

因此,它不会对实际数据压缩起到任何作用,以避免100MB的硬限制。是否对队列中的数据进行压缩?我想我可以考虑发一封信file@haju这是正确的,仅当它通过网络从一点传输到另一点时。IBM MQ没有任何队列级压缩。请参阅最近的问题,以了解问题注释中的一些其他想法:Base64更好。很好地压缩它。
public void onMessage(Message message) {
    BytesMessage bytesMessage = (BytesMessage) message;

    long bodyLength = bytesMessage.getBodyLength();
    byte[] rawPayload = new byte[(int) bodyLength];
    InputStream payloadInputStream = new ByteArrayInputStream(rawPayload);

    String contentEncoding = bytesMessage.getStringProperty("Content-Encoding");
    if("gzip".equals(contentEncoding)) {
        payloadInputStream = new GZIPInputStream(payloadInputStream);
    }

    String contentType = bytesMessage.getStringProperty("Content-Type");
    MimeType mimeType = new MimeType(contentType); // from javax.activation

    if("text".equals(mimeType.getPrimaryType())) {
        if("xml".equals(mimeType.getSubType())) {
            Charset charset;

            String charsetString = mimeType.getParameter("charset");
            if(charsetString != null) {
                charset = Charset.forName(charsetString);
            } else {
                charset = StandardCharsets.UTF_8; // default
            }

            Reader reader = new InputStreamReader(payloadInputStream, charset);

            String xml = IOUtils.toString(reader);
            IOUtils.closeQuietly(reader);
        }
    }
}