camel で netty を使用して大きな転送を書き込もうとすると、TooLongFrameException 例外が発生します。深刻なリファクタリングを行わないと、交換のサイズを実際に縮小することはできません。
回避策として、私は ObjectEncoder をより大きな EstimatedLength で明示的に指定します。ただし、オブジェクトが元の形式に自動的に変換されることはありません。キャメル ルートで convertBodyTo() を呼び出す必要があります。これには、クラスの型を事前に知っておく必要があります。
次に例を示します。
public static void main(String[] args) throws Exception{
JndiContext registry=new JndiContext();
//Workaround #1: explicitly specify the encoder so we can increase the estinatedLength.
registry.bind("encoder", new ObjectEncoder(99999999));
CamelContext context=new DefaultCamelContext(registry);
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
//This is the receiving end of the large data.
from("netty:tcp://0.0.0.0:9002?transferExchange=true&encoder=#encoder")
//At this point the body is a BigEndianHeapChannelBuffer not a String
.to("log:nettyin?level=INFO")
.bean(System.out, "println")
//Workaround #2: explicitly convert the body to the expected class. What do you do if you want several possible classes?
.convertBodyTo(String.class)
//Now we have a String as the body.
.to("log:nettyin.string?level=INFO")
.bean(System.out, "println");
//Use this endpoint to send large data.
from("direct:start")
.to("log:start?level=INFO")
.to("netty:tcp://localhost:9002?transferExchange=true&encoder=#encoder");
}
});
context.start();
final ProducerTemplate template = context.createProducerTemplate();
String s=org.apache.commons.lang.StringUtils.repeat("x", 1133461);
template.sendBody("direct:start", s);
context.stop();
}
convertBodyTo() を明示的に呼び出さない方法はありますか? また、ジェネリックをどのように処理しますか? たとえば、convertBodyTo(List.class) は List<String> では機能しません。次のような例外が発生します。
原因: org.apache.camel.NoTypeConversionAvailableException: タイプ org.jboss.netty.buffer.BigEndianHeapChannelBuffer から必要なタイプ: java.util.ArrayList の値 BigEndianHeapChannelBuffer(ridx=0, widx=422) に変換できるタイプ コンバーターがありません、キャップ=422) org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:169) で ~[camel-core-2.10.3.jar:2.10.3] org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:99) で ~[camel-core-2.10.3.jar:2.10.3] ... 40 個の共通フレームを省略