我建议压缩有效载荷并使用
ByteMessage。消息属性可用于限定有效载荷类型,类似于HTTP的“Content-Encoding”、“Content-Type”。
String payload = ...
Session session = ...
BytesMessage bytesMessage = session.createBytesMessage()
bytesMessage.writeBytes(compressGZIP(payload, StandardCharsets.UTF_8))
bytesMessage.setStringProperty("Content-Encoding", "gzip")
bytesMessage.setStringProperty("Content-Type", "text/xml
这是 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.copy(stringReader, out, charset);
}
return byteArrayOutputStream.toByteArray();
}
消费者可以请求消息属性,根据“Content-Encoding”和“Content-Type”消息属性进行解压缩并重新创建基于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);
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;
}
Reader reader = new InputStreamReader(payloadInputStream, charset);
String xml = IOUtils.toString(reader);
IOUtils.closeQuietly(reader);
}
}
}
这种解决方案的优点是您可以继续使用标准的JMS API,而不是使用特定于提供程序的配置。
缺点是发送方和接收方必须实现内容类型处理。
因此,您必须在可移植性和实现工作量之间做出决策。