2017-06-02 12 views
0

私はByteArrayRawSerializerをソケットメッセージデシリアライザとして使用しています。 メッセージの終わりは常にソケットを閉じるサーバーによって示されます。ByteArrayRawSerializerのmessageSizeを無制限に設定するにはどうすればよいですか?

メッセージが大きいので、シリアライザのメッセージサイズを無制限に定義したいと思います。しかしどうですか?

バッファオーバーフローエラーを次のようにリード線:

ByteArrayRawSerializer s = new ByteArrayRawSerializer(); 
s.setMaxMessageSize(Integer.MAX_VALUE); 
+0

私は天才が、この私の助け午前.. https://stackoverflow.com/q/479701/5204909 –

答えて

1

このような巨大なバッファサイズを使用して、完全に非現実的である、それぞれの新しい要求は、メモリの>の2Gbを割り当てるしようとするだろう。

予想されるメッセージサイズを処理するのに十分なほど妥当なサイズを使用する必要があります。

または、必要に応じてバッファをさらに割り当てるカスタムデシリアライザを作成します。

EDIT

ここ弾性生デシリアライザだ...

/* 
* Copyright 2017 the original author or authors. 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package org.springframework.integration.ip.tcp.serializer; 

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 

import org.springframework.core.serializer.Deserializer; 
import org.springframework.util.StreamUtils; 

/** 
* A deserializer that uses an elastic {@link ByteArrayOutputStream} 
* instead of a fixed buffer. Completion is indicated by the sender 
* closing the socket. 
* 
* @author Gary Russell 
* @since 5.0 
* 
*/ 
public class ByteArrayElasticRawDeserializer implements Deserializer<byte[]> { 

    @Override 
    public byte[] deserialize(InputStream inputStream) throws IOException { 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     StreamUtils.copy(inputStream, out); 
     out.close(); 
     return out.toByteArray(); 
    } 

} 
+0

ので、無制限のメッセージサイズで 'ByteArrayRawSerializer'を初期化することはできませんか?実際には私は前にメッセージサイズを知らない。 – membersound

+0

Java言語では、「Integer.MAX_VALUE」のバッファのみが許可されます。さらに、十分なメモリがある場合に限ります。 JVMはさらに制限を課す '例外はスレッド内にある" main "java.lang.OutOfMemoryError:要求された配列サイズがVM制限を超えている" –

+0

生のデシリアライザは単純です。 (より多くのバイトが到着すると)必要に応じてメモリを割り当てるためにより洗練されたものが必要になります。 –

関連する問題