LengthFieldBasedFrameDecoder无法正常工作

时间:2014-06-30 20:07:44

标签: spring apache-camel netty fuseesb jbossfuse

我在Spring DSL中有以下代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="
         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
         http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd 
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        "
    >

    <util:list id="decoders" list-class="java.util.LinkedList">
        <bean id="length-decoder" class="org.apache.camel.component.netty.ChannelHandlerFactories" factory-method="newLengthFieldBasedFrameDecoder">
            <constructor-arg value="5000"/>
            <constructor-arg value="0"/>
            <constructor-arg value="4"/>
            <constructor-arg value="0"/>
            <constructor-arg value="4"/>
        </bean>
        <bean id="string-decoder" class="org.jboss.netty.handler.codec.string.StringDecoder"/>
    </util:list>

    <bean id="length-decoder" class="org.apache.camel.component.netty.ChannelHandlerFactories" factory-method="newLengthFieldBasedFrameDecoder">
        <constructor-arg value="5000"/>
        <constructor-arg value="0"/>
        <constructor-arg value="4"/>
        <constructor-arg value="0"/>
        <constructor-arg value="4"/>
    </bean>

    <bean id="string-decoder" class="org.jboss.netty.handler.codec.string.StringDecoder"/>

    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="netty:tcp://10.1.33.204:9001?keepAlive=true&decoders=#length-decoder,#string-decoder&disconnect=true" />
            <log message="${body}" loggingLevel="INFO"/>
            <to uri="direct:SMSRequests"/>
        </route>

        <route>
           <from uri="direct:SMSRequests"/>
           <log message="${body}" loggingLevel="INFO"/>
           <setBody><simple>0004THIS</simple></setBody> <!--hardcoded response-->
           <log message="response --- ${body}" loggingLevel="INFO"/>
         </route>
    </camelContext>

</beans>

我的输入与1200<XML>....</XML>类似,其中1200是以<XML>开头的邮件的长度。

我的问题是:

  1. 我看到请求到达端口9001并且到达Netty但是Netty无法解码它们。
  2. Netty没有解码消息(我是否还需要添加编码器?)
  3. 另外,我是否需要将解码器添加到注册表中?我想在Spring dsl中,bean会自动在注册表中查找。
  4. 也不会向来电者发送任何回复。

1 个答案:

答案 0 :(得分:0)

  • 如果您没有在uri中引用该集,则不需要定义decoders
  • 如果您没有将数据发送到 Netty服务器,并且您只是从收到Netty服务器的数据,那么您不需要任何编码器
  • 您需要将length-decoder和/或string-decoder添加到注册表中,或者您无法在uri中引用它们
  • 如果没有偏移,也许您可​​以将lengthFieldOffsetlenght-decoder的第一个构造函数参数)设置为0