WebLogic JMS服务器的巨大存储空间



在我的WebLogic Server(4个节点)中,我使用(Oracle)数据库存储定义了可迁移的JMS服务器。在这里,我每秒收到1000条消息。每个消息都是大约1KB的XML消息。

我可能需要停止Java MDB 1天并存储几个GB数据(由于维护)。

我如何(在小开销的情况下)保存这些消息以减少空间?

有2种可能性,但总的来说,主要思想是压缩数据:

  1. 压缩消息:Oracle建议
  2. 压缩表空间;不是由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

最新更新