在我的WebLogic Server(4个节点)中,我使用(Oracle)数据库存储定义了可迁移的JMS服务器。在这里,我每秒收到1000条消息。每个消息都是大约1KB的XML消息。
我可能需要停止Java MDB 1天并存储几个GB数据(由于维护)。
我如何(在小开销的情况下)保存这些消息以减少空间?
有2种可能性,但总的来说,主要思想是压缩数据:
- 压缩消息:Oracle建议
- 压缩表空间;不是由Oracle Subetsss
然后让我建议第一个解决方案;然后,您可以在生产者和消费者上启用WebLogic压缩或自定义压缩。
webLogic压缩
导航到JMS连接工厂 ->单击配置> 默认交付选项卡。在默认交付页面 ->默认 压缩阈值
自定义GZIP压缩
- 发送XML消息在发送之前
- 当您收到时取消压缩
例如,如果生产者压缩消息,我使用MDB上的以下代码来提取文本;
protected String getText(Message message) throws JMSException, IOException {
if (message instanceof TextMessage) {
return ((TextMessage) message).getText();
} else if (message instanceof BytesMessage) {
byte zipped[] = new byte[(int) ((BytesMessage) message)
.getBodyLength()];
((BytesMessage) message).readBytes(zipped);
ByteArrayInputStream bais = new ByteArrayInputStream(zipped);
StringBuilder sb = null;
GZIPInputStream in = null;
try {
in = new GZIPInputStream(bais);
BufferedReader reader = new BufferedReader(
new InputStreamReader(in));
sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
} finally {
try {
if (in != null)
in.close();
} catch (IOException e) {
log.error("getText: ", e);
}
try {
if (bais != null)
bais.close();
} catch (IOException e) {
log.error("getText: ", e);
}
}
return sb.toString();
} else {
throw new JMSException("Unrecognized message type "
+ message.getClass());
}
}
自定义EXI压缩
最近我评估了有效的XML互换(EXI)格式1.0。这里的指标:
- 原始消息:8903b
- gzpipped消息:1212b
- exi示意图:903b
- 带有模式的EXI:856B
,但唯一的Java开源实现是Siemens提出的EXI Proxessor