0

Spring-rmi アプリケーションで圧縮用のカスタム ソケット ファクトリを実装しようとしています。

以下は rmi-server 設定です:

<bean id="parentRmiServiceExporter" class="org.springframework.remoting.rmi.RmiServiceExporter" abstract="true">
    <property name="registryPort" value="${rmi.port}"/>
    <property name="registerTraceInterceptor" value="false"/>
    <!-- gZip Server and Client Socket Factory -->    
    <property name="clientSocketFactory" ref=egsZipClientSocketFactory/>   
    <property name="serverSocketFactory" ref="egsZipServerSocketFactory" />
</bean>

圧縮ストリームは、以下の実装に基づいています。

http://jmvidal.cse.sc.edu/csce790/handouts/sockets/CompressionInputStream.java.html

ただし、rmi クライアントの起動時に以下のエラーが発生します。

 Caused by: java.net.SocketException: Software caused connection abort: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method) [rt.jar:1.7.0_15]
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) [rt.jar:1.7.0_15]
    at java.net.SocketOutputStream.write(SocketOutputStream.java:132) [rt.jar:1.7.0_15]

spring-rmi アプリで圧縮を実現する方法は?

4

1 に答える 1

0

DeflaterOutputStream を使用してオブジェクトを圧縮し、InflaterInputStream を使用して同じものを解凍できます。

圧縮:

ByteArrayOutputStream buf = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(new DeflaterOutputStream(buf,       new        Deflater(Deflater.BEST_COMPRESSION)));
out.writeObject(object);

egsZippedObject = new EGSZippedObject(buf.toByteArray());

public class EGSZippedObject implements Serializable{       
private byte[] byteArray = null;
public EGSZippedObject(byte[] byteArray) throws Exception { 
    setByteArray(byteArray);
}
public void setByteArray(byte[] byteArray) {
    this.byteArray = byteArray;
}
public byte[] getByteArray() {
    return byteArray;
}
}

解凍:

ByteArrayInputStream buf = null;
ObjectInputStream in = null;
R retVal = null;

buf = new ByteArrayInputStream(egsZippedObject.getByteArray());
in = new ObjectInputStream(new InflaterInputStream(buf));
retVal = (R) in.readObject();           
于 2013-09-10T13:05:33.650 に答える