Java 在骆驼上通过netty进行大交易

Java 在骆驼上通过netty进行大交易,java,netty,apache-camel,Java,Netty,Apache Camel,在尝试使用camel中的netty编写大型传输时,我遇到了TooLongFrameException异常。如果不进行一些认真的重构,我真的无法缩小我的交换机的大小 作为一种解决方法,我显式指定了一个具有更大estimatedLength的ObjectEncoder。但是,它不会自动将对象转换回其原始形式。我必须在camel路径上调用convertBodyTo(),这需要事先知道类的类型 下面是一个例子: public static void main(String[] args) throws

在尝试使用camel中的netty编写大型传输时,我遇到了TooLongFrameException异常。如果不进行一些认真的重构,我真的无法缩小我的交换机的大小

作为一种解决方法,我显式指定了一个具有更大estimatedLength的ObjectEncoder。但是,它不会自动将对象转换回其原始形式。我必须在camel路径上调用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。我遇到了这样一个例外:

Caused by: org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: org.jboss.netty.buffer.BigEndianHeapChannelBuffer to the required type: java.util.ArrayList with value BigEndianHeapChannelBuffer(ridx=0, widx=422, cap=422) at org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:169) ~[camel-core-2.10.3.jar:2.10.3] at org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:99) ~[camel-core-2.10.3.jar:2.10.3] ... 40 common frames omitted 原因:org.apache.camel.NoTypeConversionAvailableException:没有可用于从类型:org.jboss.netty.buffer.BigEndianHeapChannelBuffer转换为所需类型:java.util.ArrayList,值为BigEndianHeapChannelBuffer(ridx=0,widx=422,cap=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个公共帧
我想知道我们是否可以使用TransferXchange=true改进开箱即用的camel netty,使其具有更大的估计大小,或者netty需要什么来传输数据而不会出现问题?估计长度选项将非常有用。然而,对我来说,更大的问题是泛型。现在,我必须将列表包装到其他父对象中,否则无法在接收端使用它。然后,它将断开。split()稍后将沿着链断开。