在我的weblogic服务器(4个节点)中,我定义了具有(Oracle)数据库存储的可迁移JMS服务器。在这里,我每秒接收1000条消息。每个消息都是大约1kB的XML消息。
我可能需要停止Java MDB 1天并存储数GB的数据(由于维护)。
如何(以很少的开销)保存这些压缩的消息以减少空间?
最佳答案
有两种可能性,但总的来说,主要思想是压缩数据:
压缩消息:suggested by oracle
压缩表空间;甲骨文不建议
然后让我提出第一个解决方案:然后,您可以对生产者和使用者启用weblogic压缩或自定义压缩。
Weblogic压缩
导航到JMS Connection Factory->单击“配置”>
默认投放标签。在默认交付页面上->默认
压缩阈值
自定义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压缩
最近,我对Efficient XML Interchange (EXI) Format 1.0进行了评估。
这里的指标:
原始消息:8903B
压缩消息:1212B
exi无架构:903B
具有模式的exi:856B
但是唯一的Java开源实现是siemens提出的exi proxessor
关于java - Weblogic JMS服务器的巨大存储,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21490522/