目前我们在我们的应用程序中使用Spring Integration 2.1.0版本(由于遗留应用程序无法打开最新版本)。 申请流程如下:
这里的问题是,如果消息有除终结符之外,在配置文件中定义,消息不会到达为分配器定义的类,如果终结符相同,则它正常工作。 要求是,如果终结符值不同,则应使用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中。 请指导如何解决此问题以及问题原因以便更好地理解。
答案 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中没有消息这样的东西,也没有任何协议中带有未定义终结符的消息。