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