无法在未定义终结符的通道上接收tcp(mode is server)消息

时间:2017-11-12 17:27:01

标签: java spring sockets tcp spring-integration

目前我们在我们的应用程序中使用Spring Integration 2.1.0版本(由于遗留应用程序无法打开最新版本)。 申请流程如下:

  1. 所有配置详细信息都在配置文件中定义,如主机名,端口号,终结符等
  2. 通过渠道使用tcp-inbound-channel-adapter从TCP获取消息。
  3. 将其传递给分离器以进一步流动。
  4. 这里的问题是,如果消息有除终结符之外,在配置文件中定义,消息不会到达为分配器定义的类,如果终结符相同,则它正常工作。 要求是,如果终结符值不同,则应使用tcp-outbound-channel-adapter在同一通道上显示错误消息(由于异步调用使用了入站和出站)。  我已经在Trace级别启用了应用程序和spring日志记录,但无法理解消息被卡住的原因和位置。

    配置文件的代码是

    <Config>
    <host>localhost</host>
    <port>8888</port>
    <mode>server</mode>
    <terminator>10</terminator>
    <msgLength>65535</msgLength>
    <inChannel>telnetInboundCustomChannel</inChannel>
    </Config>
    

    用于连接详细信息的XML

    <beans:bean id="serverCustomSerializer"
    class="com.core.serializer.CustomSerializer">
    <beans:property name="terminatingChar" value="${server.terminator}"/>
    <beans:property name="maxLength" value="${server.msgLength}"/>
    </beans:bean>
    
    <beans:bean id="serverFactoryTaskExecutor"   
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <beans:property name="corePoolSize" value="5" />
    <beans:property name="queueCapacity" value="0" />
    
    </beans:bean
    <int:channel id="telnetLandingChannel" />
    <ip:tcp-connection-factory id="serverFactory" type="server"
    host="${server.host}" port="${server.port}" single-use="false"
    serializer="${server.serializer}" deserializer="${server.serializer}" task-
    executor="serverFactoryTaskExecutor"/>
    
    <ip:tcp-inbound-channel-adapter id="serverInboundAdpater"
    channel="telnetLandingChannel" connection-factory="serverFactory"
    error-channel="errorChannel" auto-startup="false"/>
    <ip:tcp-outbound-channel-adapter id="serverOutboundAdapter"
    channel="serverReplyChannel"
    connection-factory="serverFactory"
    auto-startup="true"/>
    

    渠道详细信息和流程的XML是:

    <int:channel id="telnetInboundCustomChannel" />
    
    <int:splitter id="messageSplitter"
    input-channel="telnetInboundCustomChannel" ref="telnetCustomMessageSplitter"
    method="splitCustomMessageStream" 
    outputchannel="base24CustomSplitterChannel" />
    
    <int:filter id="messageFilter" input-
    channel="base24CustomSplitterChannel"
    output-channel="base24CustomCoreMessageChannel" 
    ref="telnetCustomMessageFilter"
    method="customMessageFilter" />
    <!--Other code to get data from filer and pass it to correct router -->
    

    如果在过滤器类中看到某种消息,我可以将逻辑应用于TCP连接上的书面错误代码。 我也在TcpNetConnection类的run()上应用了断点。我无法理解Spring Integration的内部流程。消息如何传递到分离器。 如果我发送带有正确终结符的消息,我已经注意到了另外一件事,在发送错误的终结符之后,Spring将添加带有旧消息的新消息。

    看起来没有正确的终结器弹簧无法切割框架并且卡在telnetInboundCustomChannel中。 请指导如何解决此问题以及问题原因以便更好地理解。

2 个答案:

答案 0 :(得分:1)

目前尚不清楚如何检测坏终结器。根据定义,反序列化器需要在返回之前知道消息已完成。您可以检测到套接字关闭(bite&lt; 0)和n&gt; 0并返回特殊消息,但我不知道除非您知道要查找的无效终结符,否则您还可以发送消息。< / p>

修改

如果你的意思是检查另一个&#34;特殊&#34; (不可打印的)角色,那么你可以使用类似......

的东西
if (n > 0 && (bite == bytes.byteValue())) {
    break;
}
else (if bite < 0x20) {
    return ("Bad terminator for" + new String(buffer, 0, n)).getBytes();
}

答案 1 :(得分:1)

要求严格无意义。在TCP中没有消息这样的东西,也没有任何协议中带有未定义终结符的消息。