首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在WebLogic11g服务器上通过网络发送hashMap时实现压缩

在WebLogic11g服务器上通过网络发送hashMap时实现压缩
EN

Stack Overflow用户
提问于 2016-11-29 07:41:55
回答 2查看 370关注 0票数 0

我有一个hashMap,它需要通过网络从服务器传输到客户端。现在,当大小超过套接字缓冲区提供的某个限制时,将引发以下异常。

由: weblogic.socket.MaxMessageSizeExceededException:大小的传入消息引起的:'3002880‘字节超过协议的配置最大值:'3000000’字节:'t3'

在搜索它时,我发现套接字的大小应该增加,但这并不是必需的,因为这不是一个很好的解决方案。

然后,在使用"DeflaterOutputStream/InflaterInputStream“发送之前,我尝试压缩HashMap。但这里的挑战是," ObjectOutputStream“对象是由weblogic类创建的,而平减器/充气流应该在尝试创建ObjectOutputStream以使压缩工作时嵌入。

有什么办法我能做到吗?

另外,是否可以有某种方法使weblogic使用的t3协议上的压缩能够自动使用压缩。我已经对t3协议是否可行做了一些研究,但似乎t3协议不支持这一点。但我不确定weblogic的新版本是否支持这一点。

我还在考虑将HashMap分解到“套接字缓冲区大小”的块中,但它需要更改现有的设计,到目前为止并不是首选的。

请分享你对此的看法。

EN

回答 2

Stack Overflow用户

发布于 2016-11-29 07:58:55

如果HashMap将来可能包含更多的数据,那么压缩它也只是一个暂时的解决方案。永久解决该问题的方法是,如果映射中有太多的项,则将请求拆分为多个请求。

票数 1
EN

Stack Overflow用户

发布于 2017-01-09 14:35:00

您可以将Map包装到另一个对象中,例如,称为Payload,并使所有通信都成为压缩对象的一部分。

代码语言:javascript
复制
public class Payload<T extends Serializable> {
    private T payload;
    public Payload( T payload ) {
        this.payload = payload;
    }
    private T get() {
        return payload;
    }

  public static final boolean ENABLE_COMPRESSION = BooleanUtils.toBooleanDefaultIfNull( BooleanUtils.toBooleanObject( System.getProperty( "serialization.gzip.enabled" ) ), true );

    private void writeObject( ObjectOutputStream oos ) throws IOException {
        if ( ENABLE_COMPRESSION ) {
            GZIPOutputStream zos = new GZIPOutputStream( oos, 65536 );
            ObjectOutputStream sender = new ObjectOutputStream( zos );
            sender.writeObject( payload );
            sender.flush();
            zos.finish();
        } else {
            oos.defaultWriteObject();
        }
    }

    @SuppressWarnings( "unchecked" )
    private void readObject( ObjectInputStream ois ) throws ClassNotFoundException, IOException {
        if ( ENABLE_COMPRESSION ) {
            GZIPInputStream zis = new GZIPInputStream( ois, 65536 );
            ObjectInputStream receiver = new ObjectInputStream( zis );
            payload = (T) receiver.readObject();
        } else {
            ois.defaultReadObject();
        }
    }
}

然后,当发送任何对象时,它将被包装在一个Payload对象中,并因此被压缩。

代码语言:javascript
复制
public Payload<Map> someRemoteCall() {
    Map map = new HashMap();
    populate( map ); // do whatever needs to be done to fill up the map.
    Payload<Map> payload = new Payload<Map>( map );
    return payload;
}

显然,它可能涉及对接口的一些更改,这可能是不可取的,但到目前为止,这是我发现的最好的。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40860275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档